7

1列にユーザーの「役割」が格納されているユーザーのテーブルがあります。特定のユーザーに複数の役割を割り当てることができます。

次に、ロール ID を「ロール」列に格納します。

しかし、使いやすい方法でメモリを節約するために、複数の値を 1 つの列に格納するにはどうすればよいでしょうか? たとえば、コンマ区切りフィールドを使用した保存は簡単ではなく、メモリを消費します。

何か案は?

4

5 に答える 5

7

MySQL でビットごとのロジックを使用することもできます。role_idBASE 2 でなければなりません (0、1、2、4、8、16、32...)

role_id | label
--------+-----------------
      1 | Admin
      2 | User
      4 | Author

user_id | name  | role
--------+-----------------
      1 | John  | 1
      2 | Steve | 3
      3 | Jack  | 6

ビットごとのロジックにより、すべてのユーザー ロールを選択できます

SELECT * FROM users WHERE role & 1
-- returns all Admin users

SELECT * FROM users WHERE role & 5
-- returns all users who are admin or Author because 5 = 1 + 4

SELECT * FROM users WHERE role & 6
-- returns all users who are User or Author because 6 = 2 + 4
于 2016-10-25T06:44:20.073 に答える
2

あなたの質問から私が得たものは、

テーブルに置く必要があるとします。1 つは「食事」テーブルで、もう 1 つは「combo_meal」テーブルです。ここで、coma[,] を区切らずに、複数の meal_id を 1 つの COMBO_MEAL_ID 内に格納したいと考えています。そして、あなたはそれがあなたのDBをより標準的にすると言った.

私があなたの質問から間違っていない場合は、以下の私の提案を注意深く読んでください。それはあなたを助けるかもしれません。

まず、あなたのコンセプトが正しいかどうかを考えてください。間違いなく、より標準的な DB が提供されます。

このために、これらの 2 つのテーブル データを参照するために、もう 1 つのテーブル [サンプル テーブル: コンボミール_リレーション] を作成する必要があります。目に見える例の1つがそれをクリアするかもしれません。

meal table

+------+--------+-----------+---------+
|  id  |  name  | serving   |  price  |
+------+--------+-----------+---------+
|  1   | soup1  |  2 person |  12.50  |
+------+--------+-----------+---------+
|  2   | soup2  |  2 person |  15.50  |
+------+--------+-----------+---------+
|  3   | soup3  |  2 person |  23.00  |
+------+--------+-----------+---------+
|  4   | drink1 |  2 person |  4.50   |
+------+--------+-----------+---------+
|  5   | drink2 |  2 person |  3.50   |
+------+--------+-----------+---------+
|  6   | drink3 |  2 person |  5.50   |
+------+--------+-----------+---------+
|  7   | frui1  |  2 person |  3.00   |
+------+--------+-----------+---------+
|  8   | fruit2 |  2 person |  3.50   |
+------+--------+-----------+---------+
|  9   | fruit3 |  2 person |  4.50   |
+------+--------+-----------+---------+

combo_meal table

+------+--------------+-----------+
|  id  |  combo_name  | serving   |
+------+--------------+-----------+
|  1   |   combo1     |  2 person |
+------+--------------+-----------+
|  2   |   combo2     |  2 person |
+------+--------------+-----------+
|  4   |   combo3     |  2 person |
+------+--------------+-----------+

combo_meal_relation

+------+--------------+-----------+
|  id  | combo_meal_id|  meal_id  |
+------+--------------+-----------+
|  1   |      1       |      1    |
+------+--------------+-----------+
|  2   |      1       |      2    |
+------+--------------+-----------+
|  3   |      1       |      3    |
+------+--------------+-----------+
|  4   |      2       |      4    |
+------+--------------+-----------+
|  5   |      2       |      2    |
+------+--------------+-----------+
|  6   |      2       |      7    |
+------+--------------+-----------+

テーブル内を検索すると、より高速な結果が生成されます。

検索クエリー:

SELECT  m.*
FROM    combo_meal cm
JOIN    meal m
ON      m.id = cm.meal_id
WHERE   cm.combo_id = 1

うまくいけば、あなたは理解します:)

于 2016-03-24T05:16:25.923 に答える