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

EAV値をデータ型テーブルに配置する必要がありますか?

    率直に言って、最良の選択肢は「EAVではない」です。 hstoreの使用を検討してください フィールド、XML 、またはjson

    PostgreSQLでは、データ型ごとのテーブルを使用することにパフォーマンス上の利点はありません。 NULL 値はコンパクトなNULLに保存されます ビットマップなので、(NULL, NULL, NULL, 42, NULL, NULL)のようなタプルがあるかどうかはほとんど違いがありません。 または単に(42)

    これにより、CHECKを追加することもできます 正確に1つのフィールドがNULL以外でなければならないことを強制する制約 、したがって、異なるタイプの複数の値を取得することはありません。

    デモ:

    regress=> CREATE TABLE eav_ugh (
        entity_id integer,
        int_value integer,
        numeric_value numeric,
        text_value text,
        timestamp_value timestamp with time zone,
        CONSTRAINT only_one_non_null CHECK (
                (int_value IS NOT NULL AND numeric_value IS NULL AND text_value IS NULL AND timestamp_value IS NULL) OR
                (int_value IS NULL AND numeric_value IS NOT NULL AND text_value IS NULL AND timestamp_value IS NULL) OR
                (int_value IS NULL AND numeric_value IS NULL AND text_value IS NOT NULL AND timestamp_value IS NULL) OR
                (int_value IS NULL AND numeric_value IS NULL AND text_value IS NULL AND timestamp_value IS NOT NULL)
        )
    );
    CREATE TABLE
    regress=> insert into eav_ugh (entity_id, numeric_value) select x, x from generate_series(1,5000) x;
    INSERT 0 5000
    regress=> select pg_relation_size('eav_ugh');                                           
     pg_relation_size 
    ------------------
               229376
    (1 row)
    
    regress=> CREATE TABLE no_null_cols(entity_id integer, numeric_value numeric);
    CREATE TABLE
    regress=> insert into no_null_cols (entity_id, numeric_value) select x, x from generate_series(1,5000) x;
    INSERT 0 5000
    regress=> select pg_relation_size('no_null_cols');
     pg_relation_size 
    ------------------
               229376
    (1 row)
    
    regress=> SELECT sum(pg_column_size(eav_ugh)) FROM eav_ugh;
      sum   
    --------
     164997
    (1 row)
    
    regress=> SELECT sum(pg_column_size(no_null_cols)) FROM no_null_cols;
      sum   
    --------
     164997
    (1 row)
    

    この場合、おそらく配置要件が原因で、ヌルビットマップはスペースをまったく追加していません。




    1. Djangoviews.pyバージョンのSQL結合とマルチテーブルクエリ

    2. 私のSQLクエリをcrmのqueryexpressionまたはfetchxmlに変換します

    3. SQLServerでOVER句とPARTITIONBY句を使用して現在の合計を計算する

    4. PythonのMySQLdbは、自作のMySQLでlibmysqlclient.dylibを見つけることができません