1

私は次のような問題を解決するために(MySQLを使用して)コードを書いています:

(ユーザーごとに)20個のブールオプションがあります。

20を格納ENUM('false','true')するか、これらのオプションのIDのみをテーブルに入れる必要がありますか(したがって、ユーザーあたりの行数は20未満である可能性があります)?

4

5 に答える 5

4

新しいオプションが表示される可能性が高く、オプションでフィルタリングしない場合は、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
于 2013-01-17T10:23:37.953 に答える
3

Optionsさまざまなオプションを使用してテーブルを作成することをお勧めします。

+---Options---+
ID
Option

+---Users---+
ID
Name

+---User_Options---+
User_id
Option_id

Optionsさらにオプションが必要な場合は、それらをテーブルに挿入します。この方法でデータベースを変更する必要はありません。

編集:削除:Quassnoiのように、「TRUE」の場合はレコードを追加する方が適切であり、レコードがない場合は「FALSE」と見なす必要がありますconditionuser_options

于 2013-01-17T10:20:16.833 に答える
1

TINYINT 0 または 1 として格納することをお勧めします。多くのフレームワークは、TINYINT データ型ですぐに使用でき、ブール値として処理します。

于 2013-01-17T10:17:37.610 に答える
0

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 に当てはまります。

于 2013-01-17T10:26:01.507 に答える
0

ビットマスク列を使用することをお勧めします。オプションごとに新しい列を作成するのではなく、多数のオプションがある場合は、ビット単位の比較をすばやく実行できます。

詳細については、次を参照してください。

特権ビットマスクでMySQLデータベースからユーザーを選択しますか?
PHP でビットマスクまたはリレーショナル ACL を実装する ビット
マスクを使用してステータスを示す

于 2013-01-17T10:27:19.340 に答える