Entity-Attribute-Valueテーブルを使用して属性を記録しました。
これは反対です 正規化の。
同じ列に異なる属性を配置するように導いた正規化のルールに名前を付けます。 これは正規化の方法ではないため、できません。
現在のEAVデザインでクエリを実行するには、結果をピボットして、元のテーブルがあるかのように何かを取得する必要があります。
SELECT * FROM (
SELECT
a.article_id,
a.title,
MAX(CASE attr_group WHEN 'ref_id' THEN attribute END) AS ref_id,
MAX(CASE attr_group WHEN 'dial_c_id' THEN attribute END) AS dial_c_id
-- ...others...
FROM test.articles_test a
INNER JOIN attributes attr ON a.article_id = attr.article_id
GROUP BY a.article_id, a.title) AS pivot
WHERE pivot.ref_id = '127712'
AND pivot.dial_c_id = 51
上記のクエリは希望する結果を生成できますが、パフォーマンスはひどいものになります。 両方のテーブルのすべてのデータを含むサブクエリの一時テーブルを作成する必要があります。 、次に、一時テーブルに対してWHERE句を適用します。
元のテーブルの独自の列に各属性を配置することをお勧めします。
将来、多くの属性を許可しようとしているとのことですが。これは一般的な問題です。
各商品に多くのパラメータがあるさまざまな種類の商品の商品テーブルを設計する方法
しかし、そうではないので、「正規化」と呼ぶべきではありません。 非正規化すらされていません 。 derelational 。
言葉を使って好きなことを説明することはできません。特に、言葉の意味の反対ではありません。自転車のタイヤから空気を抜いて「膨らませている」と言えません。
データベースを「スケーラブル」にしようとしているとコメントしました。また、「スケーラブル」という言葉の意味を誤解しています。 EAVを使用することで、必要なクエリを作成するのが難しく、実行するのが非効率的で、データが10倍のスペースを占める構造を作成しています。 スケーラブルの反対です。
つまり、拡張可能なシステムを作成しようとしているということです。 。これはSQLで実装するのは複雑ですが、リンクした他のStackOverflowの回答でいくつかのソリューションについて説明します。私のプレゼンテーション