2011-06-20 4 views
0

データベースをいくつか格納しています。各ユーザーには、アカウント設定、プライバシー設定、およびその他多くのプロパティを設定できます。それらのプロパティの数が増加し始めたと私は30以上のプロパティで終わる可能性があります。データベーステーブルの整理 - 多数のプロパティ

これまでは、UserとUserInfoがOne-To-Many(すべての変更のログを保持)として関連づけられた「UserInfo」テーブルに保持していました。それを単一の "UserInfo"テーブルに置くことはいいとは言えません。少なくともデータベースモデルでは、それは乱雑に見えます。解決策は何ですか?

プライバシー設定、アカウント設定、および別のテーブルの設定の他の「グループ」を分離し、UserInfoと各設定テーブルグループとの間に1-1の関係があることは1つの解決策ですが、それは遅すぎるデータを取得していますか?私は、すべてのデータが同じ瞬間に1ページに表示されないと思います。だから多分各テーブルに1対多の関係を持たせることも解決策です(各グループのログを別々に保つこと)?

答えて

1

プロパティが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'; 

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

関連する問題