私は次のような問題を解決するために(MySQLを使用して)コードを書いています:
(ユーザーごとに)20個のブールオプションがあります。
20を格納ENUM('false','true')
するか、これらのオプションのIDのみをテーブルに入れる必要がありますか(したがって、ユーザーあたりの行数は20未満である可能性があります)?
新しいオプションが表示される可能性が高く、オプションでフィルタリングしない場合は、EAV
構造 (オプションごとのレコード) を使用することもできます。
このようにして、新しいオプションをより簡単に追加できます (メタデータへの変更はありません)。
TRUE
オプション値がor FALSE
(不可能) であると仮定すると、デフォルト以外のオプション値 (あなたの場合)NULL
に対してのみレコードを作成する必要があります。TRUE
記録がないということは、偽であることを意味します。
すべてのオプションを取得するには、次を使用できます。
SELECT *, GROUP_CONCAT(CONCAT(o.id, ': ', ov.user IS NULL), ', ' ORDER BY o.id)
FROM users u
CROSS JOIN
options o
LEFT JOIN
option_value ov
ON (ov.user, ov.option) = (u.id, o.id)
GROUP BY
u.id
、これにより動的出力が得られます。
user_id options
1 1: 0, 2: 1, 3: 0
Options
さまざまなオプションを使用してテーブルを作成することをお勧めします。
+---Options---+
ID
Option
+---Users---+
ID
Name
+---User_Options---+
User_id
Option_id
Options
さらにオプションが必要な場合は、それらをテーブルに挿入します。この方法でデータベースを変更する必要はありません。
編集:削除:Quassnoiのように、「TRUE」の場合はレコードを追加する方が適切であり、レコードがない場合は「FALSE」と見なす必要がありますcondition
。user_options
TINYINT 0 または 1 として格納することをお勧めします。多くのフレームワークは、TINYINT データ型ですぐに使用でき、ブール値として処理します。
3 つのテーブルを作成します。最初のものは 'user_table' です。username と user_id が含まれています。サンプルデータを以下に示します
テーブル作成スクリプトを以下に示します
ここで、options_table という別のテーブルを作成します。各オプションの option_name と option_id が含まれています。サンプルを以下に示します
ここで、「selected_options」という 3 番目のテーブルを作成します。そのテーブルはユーザーをオプションにマップします。user_id と option_id が含まれています
サンプルを以下に示します
上記の例では、user1 が option1 と option2 を選択しました
および user2 が option1、option2、および option3 を選択した場合、つまり、option1、option2、および option3 は user2 に当てはまります。
ビットマスク列を使用することをお勧めします。オプションごとに新しい列を作成するのではなく、多数のオプションがある場合は、ビット単位の比較をすばやく実行できます。
詳細については、次を参照してください。
特権ビットマスクでMySQLデータベースからユーザーを選択しますか?
PHP でビットマスクまたはリレーショナル ACL を実装する ビット
マスクを使用してステータスを示す