ゼロ、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)
);
これは、多くのを持つことができる基本的なKey-Valueストアパターンです。 ユーザーごとの属性。
このためのストレージ要件は、attribute1
のような永続的にイライラする名前を持つ固定列の配置よりも高くなりますが 、テラバイトサイズのハードドライブの時代にはコストが十分に小さいため、問題になることはめったにありません。
通常、挿入時間が問題になるまで、このデータ用に単一のテーブルを作成します。あなたの挿入が速い限り、私はそれについて心配しません。その時点で、シャーディングを検討する必要があります。 このデータを同一のスキーマを持つ複数のテーブルに分割する戦略。ただし、必要な場合に限ります。
これは約1,000万〜5,000万行の段階になると思いますが、このテーブルの挿入アクティビティの量が比較的少ない場合はさらに高くなる可能性があります。
読み取りアクティビティを最適化する最善の方法は、キャッシュを使用することであることを忘れないでください。最速のデータベースクエリは、作成しないクエリです。そのようなことには、通常、memcached のようなものを使用します 以前のフェッチの結果を保存するには、書き込み時にこれを無効にします。
いつものように、提案されたスキーマを本番でベンチマークします。 スケール。