4

この質問は以前に尋ねられたことを知っていますが、最良の答えは次のようです: ユーザー設定を保存するための最良の方法は?

ただし、いくつかの追加基準があるため、この質問を再度行います。あるユーザーの設定を別のユーザーの設定と比較し、2 人のユーザーの違いをすばやく取得できるようにする必要があります。すべてのユーザーの設定はブール値になります。

これを達成するための最良の方法は何ですか?

私は次のように考えていました: すべてのユーザー設定を表す 2 進数を持っています: 例: 1100011100.. 各ビットは特定の設定に対応します

次に、それを BINARY タイプとして保存するか (255 ビット、つまり 255 の設定を保存できます。そうですか?)、バイナリを int に変換して int として保存します (選択は INT または BIGINT - INT = 4 のいずれかです)。 *8 = 32 ビット、BIGINT = 8*8 = 64 ビット)

そうすれば、ユーザーのテーブルに設定を保存する追加の列が1つだけ必要になり、2進数を取るだけで2人のユーザー間の設定を簡単に比較できます

私がやろうとしていることを行う方法や、ここでやろうとしている方法に問題があることについて、他のアイデアを持っている人はいますか?

(注: データベースは私の得意分野ではありません)

4

3 に答える 3

2

特定の設定を持つユーザーのクエリが非常に困難になるため、BINARY Bitmask オプションは使用しないことをお勧めします。

私が見た方法の 1 つは、データベース内のキーと値のペアを使用することです。

SettingsTable
(
  FkUserId int,
  SettingKey varchar(1024),
  SettingValue varchar(1024)
);

これは多数のユーザーにうまく対応できませんが、データベースを変更せずに任意の数のキーと値の組み合わせを簡単に追加できます。

settingsKey テーブルと設定値テーブルを使用して、より効率的な方法で同様のことを行うことができます。

SettingsKeys
(
  KeyId int,
  SettingKey varchar(1024)
);



SettingsTable
(
  FkUserId int,
  FkKeyId int,
  SettingValue varchar(1024)
);

これは元の設定テーブルよりも効率的であり、スキーマを変更することなく、可能な設定をいくつでも保存できます。

いくつかのアイデアです。

于 2012-04-14T20:55:06.773 に答える
0

あなたの整数のアイデアは、問題への最良のアプローチのように聞こえます。整数をビット表現に変換するストアドプロシージャまたは同等のものをmysqlに持つことができます。同じことを行う方法の詳細については、次の質問SQL Server Convert integer to binary stringを参照してください。

于 2012-04-12T06:54:45.430 に答える
0

データベースは次の質問に答える必要がありますか?

与えられた好みについて、どのユーザーがそれを持っていますか?

フィールド内のビットをエンコードすると、DBMS がこれらの各ビットにインデックスを付け、上記の質問に効率的に答えることができなくなります。

一般に、原子性の原則(したがって 1NF) に違反することは、いくつかの非常に正当な理由によって正当化されるはずです。正直なところ、特定の (狭い) クラスのクエリの領域の節約とパフォーマンスにおいて、実際にはそのような理由があるかもしれません。失われる柔軟性が将来実際に必要になることは決してないことを確認してください.

于 2012-04-12T16:06:08.403 に答える