-5

例えば:

An item
{
size:23"
Resolution:1920*1080
Panel:IPS
}
(as in an usual table)

mysqlの1つのストアの通常の方法は、列名「size」などを作成することです。ただし、私の懸念するペアの最初の項目は不定であるため(たとえば、ユーザーがproducer:samsungなどのデータを入力できるようにしたい場合やユーザーが入力したいデータペアを入力できるようにしたい場合)

mysqlでエレガントにそれを行う方法はありますか?多分一般的な分離された文字列?いずれにせよ、これらのデータをテーブルとして簡単に出力し、size =22"のすべてのアイテムを取得するような検索を行う可能性があります。

4

2 に答える 2

2

MySQL ソリューション。

Entity    Key        Value
An item   size       23"
An item   Resolution 1920*1080
An item   Panel      IPS

SELECT * FROM table where Entity = 'An item'; //Selecting info on an item

SELECT * FROM table where Entity IN   //Selecting info on items with size = '22"'
   (SELECT Entity WHERE Key = 'size' AND Value = '22"');

コメント:

  • すべてのデータは文字列として保存され、DB の型チェックが失われ、非効率的です
  • 多くのアプリケーション ロジックとサブクエリ。
  • エンティティを ID にして、エンティティ名と必要なフィールド用に別のテーブルを作成できます。
  • マルチフィールド キー テーブル (エンティティ、キー) です。

これが最善のアプローチである理由:

  • 単一のフィールド内のカンマ区切りの値は、データベースの要点全体を壊します。

このプロパティは第 1 正規形です。フィールドに複数の値を入力すると、SQL を使用してフィールドを並べ替えることができなくなります (少なくとも、かなり高速な方法ではできません)。

また、競合する解析などの問題もあります-エスケープする必要がある文字が増えます。

  • 実行時にテーブル スキーマを変更し、新しいフィールドを追加することも、パフォーマンスに悪影響を及ぼします。

非常にまばらなテーブルになり、多くの NULL エントリが作成されます。

于 2012-12-29T16:30:29.397 に答える
1
table_name( primary_key, pair_name, pair_value)

select *
from table_name
where (pair_name = 'size' and pair_value = '22')
and primary_key = ........
于 2012-12-29T16:21:17.710 に答える