リレーショナルデータベースのキーバリューペア
質問
データベースにkey-valueペアを保存した経験のある方はいらっしゃいますか?
私はこのようなテーブルを使っています。
CREATE TABLE key_value_pairs (
itemid varchar(32) NOT NULL,
itemkey varchar(32) NOT NULL,
itemvalue varchar(32) NOT NULL,
CONSTRAINT ct_primarykey PRIMARY KEY(itemid,itemkey)
)
そうすると、例えば以下のような行が存在することになります。
itemid itemkey itemvalue
---------------- ------------- ------------
123 Colour Red
123 Size Medium
123 Fabric Cotton
この方式の問題点は、データを抽出するために必要なSQL構文が非常に複雑であることです。 単に一連のキー/値列を作成する方が良いのでしょうか?
CREATE TABLE key_value_pairs (
itemid varchar(32) NOT NULL,
itemkey1 varchar(32) NOT NULL,
itemvalue1 varchar(32) NOT NULL,
itemkey2 varchar(32) NOT NULL,
itemvalue2 varchar(32) NOT NULL,
. . .etc . . .
)
これはクエリがより簡単で速くなりますが、最初のアプローチの拡張性に欠けています。 何かアドバイスはありますか?
どのように解決するのですか?
アプローチを続ける前に、一歩下がって、このデータを本当にキーと値のペアのテーブルに格納したいのかどうか、謙虚に検討することをお勧めします。 あなたのアプリケーションを知らないのですが、私の経験では、あなたが行っていることを行うたびに、後になってから、色テーブル、生地テーブル、およびサイズ テーブルを作成しておけばよかったと思うことがあります。
参照整合性制約について考えてみましょう。キーと値のペアのアプローチを取る場合、データベースは、サイズ フィールドに色 ID を格納しようとしているときに、それを知ることができません。
複数のドメインにわたって何千もの値を持つ可能性のある一般的な値に対して、10個の値を持つテーブルで結合することのパフォーマンス上の利点について考えてみてください。 キーバリューに対するインデックスが本当に役に立つのでしょうか?
通常、あなたが行っていることを行う理由は、ドメインが "ユーザー定義可能である必要があるからです。 もしそうであれば、私でさえも、その場でテーブルを作成することを推し進めるつもりはありません (それは実現可能なアプローチですが)。
しかし、あなたの理由が、複数のテーブルよりも管理が簡単だと思うから、または、すべてのドメインに対して汎用的なメンテナンス ユーザー インターフェイスを想定しているからであるならば、続ける前に立ち止まってよく考えてみてください。
関連
-
[解決済み] SQL Server FOR EACH ループ
-
[解決済み] SQLのカラム名があいまいな場合のクエリエラー
-
[解決済み] SQLのSELECTでIF...THENを実行するにはどうすればよいですか?
-
[解決済み] ATTACHで開いたSQLiteデータベースファイルのテーブルを一覧表示するにはどうすればよいですか?
-
[解決済み] MySQLデータベースの名前を素早く変更する(スキーマ名を変更する)方法は?
-
[解決済み] SELECT' 文の 'IF' - カラムの値に基づいて出力値を選択する
-
[解決済み] 複数の列に対してSELECT DISTINCTする方法(またはできる方法)は?
-
[解決済み] 別のテーブルに一致する項目がない行を選択するにはどうすればよいですか?
-
[解決済み] Postgres でサブクエリを使用してテーブルの行を更新する
-
[解決済み】SQL Serverで既存のテーブルにデフォルト値を持つカラムを追加する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
MHAの高可用性構成とフェイルオーバー
-
[解決済み] Oracleで上位100行を選択する方法は?
-
[解決済み] JOINとINNER JOINの違いについて
-
[解決済み] 各グループの最後のレコードを取得する - MySQL
-
[解決済み] カラム名の変更 SQL Server 2008
-
[解決済み] 各グループの上位1行を取得
-
[解決済み] SQL Serverで結果をページ分割する最も良い方法は何ですか?
-
[解決済み] 項目xにアクセスできるように文字列を分割するにはどうすればよいですか?
-
[解決済み] 既存のカラムにIDを追加する
-
[解決済み] Count()で条件を指定することは可能ですか?