sql >> データベース >  >> RDS >> Mysql

特定の基準に一致する正規化されたMySQL5.7構造から値を取得する方法

    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の回答でいくつかのソリューションについて説明します。私のプレゼンテーションMySQLを使用した拡張可能なデータモデリング もお気に召すかもしれません。 。




    1. PHPを使用してMySQL変数をGoogleマップに挿入する

    2. SQLでのCREATETABLE–SQLでのテーブルの作成について知っておくべきことすべて

    3. データベースを削除できません

    4. 2014年10月CPUがArcGISDesktopをクラッシュ