0

以下にサンプルテーブルがあります。

+-------------------------------------------------------------------+
| id | name | flag1 | flag2 | flag3 | flag4 | flag5 | flag6 | flag7 |
+-------------------------------------------------------------------+
| 1  | fred | 1     | 0     | 1     | 1     | 1     | 1     | 1     |
+-------------------------------------------------------------------+

私が知りたいのは、これがこれらのデータを取得するための最も効率的で簡単な方法ですか?

私は現在、いくつかのフラグ属性ロジックを持つEnumに取り組んでいます。

その場合、次の場合:

flag1 = 1
flag2 = 2
flag3 = 4
and so on..

このデザインでテーブルを作成し、それらの値を検索するために別のテーブルを追加します。

+------------------+
| id | name | flag |
+------------------+
| 1  | fred | 125  |
+------------------+

助言がありますか?

4

2 に答える 2

1

バイナリ関数を使用してさまざまなビットを取得/設定することにより、すべてのフラグを 1 つの整数フィールドに格納できます。参照: MySql ビット関数

このユースケースについて、そのページにいくつかのコメントがあります。最新のものは、フラグを読み取るための典型的な SQL を示す良い例です。

選択する
SUM(IF(ルーブリック & 1, 1, 0)) アクタス,
SUM(IF(rubrik & 2, 1, 0)) ショッピング、
SUM(IF(rubrik & 4, 1, 0)) ユーティリティ、
SUM(IF(rubrik & 8, 1, 0)) 通信、
SUM(IF(rubrik & 16, 1, 0)) サービス、
COUNT(user_id) AS 合計、
FROM プリファレンス p
于 2013-02-22T09:37:09.240 に答える
1

私が知りたいのは、これがこれらのデータを取得するための最も効率的で簡単な方法ですか?

tmによります;)

フラグは常に正確に 7 つですか?

  1. はいの場合、それらを同じ行に格納するのが適切です。
  2. いいえの場合は、「メイン」テーブルと N:1 の関係にある別のテーブルにフラグを移動します。これにより、テーブルに列を追加することなく、フラグの数を簡単に変更できます。

上記(1)の場合、個々のフラグを見つける必要がありますか?

  • はいの場合は、それらを別々のフィールドに保管して、別々に索引付けできるようにします。ただし、インデックスが十分に選択的である場合にのみ、インデックス作成が役立つことに注意してください。
  • そうでない場合は、フラグを単一の整数フィールド内のビットとしてエンコードすることで、ストレージ スペースを節約する (さらに重要なことに、キャッシュの有効性を高める) ことができます。非常に古いバージョンの MySQL を使用している場合を除き、 BIT(M)の使用を検討してください。ドキュメントからの引用:

    「このデータ型は MySQL 5.0.3 で MyISAM 用に追加され、5.0.5 で MEMORY、InnoDB、BDB、および NDBCLUSTER に拡張されました。5.0.3 より前では、BIT は TINYINT(1) のシノニムです」

于 2013-02-22T14:08:57.630 に答える