プロパティが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';
これは、あなたがユーザーに行を挿入または更新する手段として、あなたはまた、挿入したり、補助テーブルのそれぞれに更新し、あなたのデータと同期して、それを維持するためにする必要があります。補助テーブルを追加すると、複雑な作業に発展する可能性があります。