私は最近いくつかのことを考えていて、次のシナリオのようなことを行う正しい方法は何だろうと思っていました (DB の人がそのようなことをするのは非常に一般的なことだと確信しています)。
次のような製品テーブルがあるとしましょう (MySQL):
CREATE TABLE `products` (
`id` int(11) NOT NULL auto_increment,
`product_name` varchar(255) default NULL,
`product_description` text,
KEY `id` (`id`),
KEY `product_name` (`product_name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
ここでは異常なことは何もありません。ここで、別のテーブルにカテゴリの階層があり、製品テーブルと多対多の関係をバインドする別のテーブルがあるとしましょう - 各製品が何らかのカテゴリに属するようにします (それらは省略します) 、それはここでは問題ではないため)。
ここで興味深いのは、各カテゴリが製品アイテムに追加の変数セットを要求する場合です。たとえば、コンピューター モニター カテゴリの製品には、LCD/CRT 列挙型フィールド、画面サイズ列挙型などを含める必要があります。また、他のカテゴリでは、アイスクリームにフレーバー varchar、棚保管時間 int などの他の変数があるとします。
ここでの問題は、すべての製品に共通の変数セット (id、名前、説明など) があるが、カテゴリごとに一貫していない追加の変数があることです。ただし、すべての製品は共通のセットを共有する必要があります。最終的に、それらはすべて製品グループに属しているため、たとえば SELECT * FROM products ORDER BY company_id などのクエリを実行できます (些細な例で、代表的ではないかもしれませんが、全体像がわかります)。
今、私はいくつかの潜在的な解決策を見ています:
- 製品カテゴリごとに個別のテーブルを生成し、そこに製品を適切な追加変数とともに保存します - 愚かでクエリフレンドリーではありません
- 製品テーブルは共通の変数と同じままであり、カテゴリごとに別のテーブルを作成し、追加の変数を追加しますJOIN で 2 つのテーブルをバインドする変数 - 正規化されていますが、クエリのパフォーマンスと明確性の問題 - カテゴリ (1 番目のテーブル - 製品) から製品をフィルタリングする方法と、追加の変数 (17 インチ LCD モニターなど) 用の追加のフィルター - SQL が必要です。 JOIN トリック
- 製品テーブルは同じままで、追加の変数を保持する JSON データなどを保持する別の変数タイプのテキストを追加します - コンパクトですっきりしていますが、SQL で変数をフィルタリングすることはできません
私はここで非常に明白で単純なものが欠けていることを知っています-私は正規化技術について少し錆びています:)
編集:この質問をする前に、スタックオーバーフローを検索してきましたが、成功しませんでした。ただし、質問を投稿した後、「正規化」タグの 1 つをクリックすると、同様の質問がいくつか見つかり、「一般化専門化リレーショナル デザイン」が検索されました。話の要点は、タグが実際に検索に役立つということは、私のインターネット生活の中で初めての経験にちがいないということです。まだまだですが、皆様のご意見、ご感想をお待ちしております。
edit2 : アプローチ no.2 の問題は、約 1000 の専門化が予想されることです。カテゴリには階層 (1 ~ 4 レベルの深さ) があり、エンド ノードには特殊な変数が追加されます。それらは約 1000 のオーダーで蓄積されるため、特殊なテーブルを追加して結合するのは少し現実的ではありません。
edit3 :私の場合、属性のボラティリティが非常に多いため、提案された「エンティティ属性値」は進むべき道のように見えます。クエリの悪夢がやってくる! みんなありがとう。