プロパティが 30 個しかない場合は、30 個の列を作成することをお勧めします。これは、最新のデータベースで処理するには多すぎません。
しかし、今日 30 のプロパティを持っている場合、時間の経過とともに新しいプロパティを発明し続け、列の数が増え続けると思います。毎日列を追加するようにテーブルを再構築すると、多くの行が得られるため、時間がかかる場合があります。
別の解決策については、「スキーマレス」な方法で多くの動的属性を保存するための気の利いた解決策について、このブログをチェックしてください: How FriendFeed Uses MySQL .
基本的に、すべてのプロパティを何らかの形式にまとめて、1 つの TEXT 列に格納します。形式は半構造化されています。つまり、アプリケーションは必要に応じてプロパティを分離できますが、いつでも追加したり、行ごとに異なるプロパティを持つこともできます。XML、YAML、または JSON はサンプル形式、またはアプリケーション コード言語でサポートされているオブジェクトのシリアル化形式です。
CREATE TABLE Users (
user_id SERIAL PRIMARY KEY,
user_proerties TEXT
);
これにより、特定のプロパティで特定の値を検索することが難しくなります。したがって、TEXT 列に加えて、検索可能にする各プロパティの補助テーブルを作成します。このテーブルには、特定のプロパティの値と、その特定の値が見つかるメイン テーブルへの外部キーの 2 つの列があります。これで、列にインデックスを付けることができるので、検索が迅速になります。
CREATE TABLE UserBirthdate (
user_id BIGINT UNSIGNED PRIMARY KEY,
birthdate DATE NOT NULL,
FOREIGN KEY (user_id) REFERENCES Users(user_id),
KEY (birthdate)
);
SELECT u.* FROM Users AS u INNER JOIN UserBirthdate b USING (user_id)
WHERE b.birthdate = '2001-01-01';
これは、Users の行を挿入または更新するときに、データとの同期を維持するために、各補助テーブルにも挿入または更新する必要があることを意味します。補助テーブルを追加すると、これは複雑な雑用に発展する可能性があります。