ゼロ、1、または多数の原則に従う場合、つまり、そのようなものは存在しないか、そのうちの 1 つが存在するか、数に制限がないかのいずれかである場合は、常に適切に正規化されたテーブルを作成して、このようなものを追跡します。
たとえば、考えられるスキーマは次のとおりです。
CREATE TABLE user_attributes (
id INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
user_id INT NOT NULL,
attribute_name VARCHAR(255) NOT NULL,
attribute_value VARCHAR(255),
UNIQUE INDEX index_user_attributes_name(user_id, attribute_name)
);
これは、ユーザーごとに多くの属性を持つことができる基本的なキー値ストア パターンです。
これに必要なストレージは、 のような永続的に苛立たしい名前を持つ固定列配置よりも高くなりますがattribute1
、テラバイト サイズのハード ドライブの時代にはコストが十分に小さいため、問題になることはめったにありません。
通常、挿入時間が問題になるまで、このデータ用に単一のテーブルを作成します。あなたの挿入が速い限り、私はそれについて心配しません。その時点で、必要な場合にのみ、このデータを同一のスキーマを持つ複数のテーブルに分割するシャーディング戦略を検討する必要があります。
1,000 万から 5,000 万行の段階になると思いますが、このテーブルの挿入アクティビティの量が比較的少ない場合は、それ以上になる可能性があります。
読み取りアクティビティを最適化する最善の方法は、キャッシュを使用することであることを忘れないでください。最速のデータベース クエリは、作成しないものです。そのような場合、通常はmemcachedのようなものを使用して以前のフェッチの結果を保存し、書き込み時にこれを無効にします。
いつものように、提案されたスキーマを実稼働スケールでベンチマークします。