2011-12-21 12 views
10

私はユーザ/クライアントのための新しいシステムを設計しています。コードとデータベースを作成する前に、私は正しいことをしています。配列または個々のフィールドとしてデータを保存する(PHP/MySQL)

私はこれらの設定があります。

  • フォントサイズ
  • フォントフェース
  • フォントの色
  • テーマ
  • ホームページ
  • ダッシュボードオプション
  • のようないくつかの真/偽のオプションを共有などを有効にする...

以上。

私の考えは、各環境設定ごとに各フィールドを作成することでしたが、おそらくオブジェクトまたは配列をblobに保存することができます。

いいですか?

答えて

12

補助テーブルを作成してプロパティ名の参照を保持することができます。次に、そのテーブルを、ユーザーIDとプロパティの1つのIDの間のマージテーブル—とリンクさせることができます。そうすることで、いつでもプロパティを変更できます。

外部キーの使用“カスケード削除”もう存在しないプロパティを持つユーザーの詳細。さらに、有効なプロパティ名への参照のみを追加し、インデックスを使用して検索を最適化することができます。

のはそれを言ってみましょう:

CREATE TABLE user_preferences_headers 
(
    `id` INT NOT NULL PRIMARY KEY AUTO_INCREMENT, 
    `name` VARCHAR(255) NOT NULL 
); 

CREATE TABLE `users` 
(
    `id` INT NOT NULL PRIMARY KEY AUTO_INCREMENT, 
    `name` VARCHAR(255) NOT NULL, 
    `pass` VARCHAR(255) NOT NULL 
); 

CREATE TABLE `user_preferences` 
(
    `id_user` INT NOT NULL, 
    `id_preference_entity` INT NOT NULL, 
    `value` VARCHAR(255) 
); 

ALTER TABLE `user_preferences` ADD INDEX (`id_user`); 
ALTER TABLE `user_preferences` ADD INDEX (`id_preference_entity`); 

ALTER TABLE `user_preferences` ADD FOREIGN KEY (`id_user`) REFERENCES `users` (
`id` 
) ON DELETE CASCADE ON UPDATE CASCADE ; 
ALTER TABLE `user_preferences` ADD FOREIGN KEY (`id_preference_entity`) REFERENCES `user_preferences_headers` (
`id` 
) ON DELETE CASCADE ON UPDATE CASCADE ; 

今、あなたはファーストネームでuser_preferences_headersからすべてのヘッダーを選択するか、ではない、とあなたは(idでも識別される)、ユーザの所望のプリファレンス値を選択するために、IDを使用してから、 user_preferencesuser_preferences_headersのエントリを削除すると、削除された行のIDにリンクするすべてのエントリも削除されます。

+0

+1を正規化します。これは本当に良いアイデアです。 – Herbert

3

個別に保存すると、各フィールドで検索などが可能になります。シリアライズすると、検索が困難/不可能になります。
これは今必要ではないかもしれませんが、もっと下に行く必要があります。

関連する問題