2017-03-16 8 views
0

私はこのデザインを持っています。複数のモデルのデータベース設計ですか?

models

id - primary key 
title - varchar(256) 

model_instances

id - primary key 
model_id - foreign key to app_models.id 
title - varchar(256) 

model_fields

id - pk 
model_id - foreign key to models.id 
instance_id - foreign key to model_instances.id 
title - name of the field 
type - enum [text, checkbox, radio, select, 'etc'] 

model_field_values

instance_id - forein key model_instance.id 
field_id - foreign key to model_fields.id 
value - text 

はまた、(複数選択ドロップダウンのためのような)いくつかのフィールドに

多くvaluesがあるという問題がある:私は別のデータの種類(テキスト、日時、整数を保存するためvalueは、常にtextフィールドです)、この表にはすべてのモデルのすべてのインスタンスのすべての値が含まれています。

たとえば、モデルが10個あり、すべてのモデルに10個のフィールドがある1000個のインスタンスがある場合、model_field_values(最小値)は100000個の行を含み、複数のフィールドが複数の場合は(120000-150000行)

valueを使用してSQLの選択が遅くなる可能性があります。

解決方法1:

For every model create new model_field_values like: 

model.id = 1, model_field_values_1 
... 
model.id = 10, model_field_values_10 

が解決策2:

model_fieldsは、モデルのすべてのフィールドが含まれているので、私たちは、主キーでmodel.id = 1(のために、この

model_fieldsようmodel_field_valuesを作成することができます):1 - テキスト、2 - 整数、3 - datetime、4 - smalltext

field_ text_field_values_1のフィールド:field_1テキスト、field_2整数、field_3 datetime、fie ld_4 varchar(256)

multipleの値はすべて、model_field_values_1の行にリンクする別のテーブルを持つ必要があるため、複数の値を持つフィールドには適しませんが、mysqlはネイティブデータ型を使用するため、 in where句(テキストフィールドではない)。

私は何かが恋しいですか?より良いデザインがあるかもしれませんか?

このデータベースは、これらのモデルで多数のインスタンスを持つ異なるモデルを作成できるcrm-systemで使用されるため、すべてのテーブルをすべての列で事前設定することはできません。

答えて

0

注:通常のMySQLの操作では、200,000行(メガロの2分の1)は中規模のテーブルです。このようなテーブルをかなり効率的に索引付けすることは、一般的に可能です。 http://use-the-index-luke.com/

言われているように、私はだと思います。あなたの問題を理解しています。これは、オブジェクト指向設計の専門用語では、多型性です。

あなたは、あなたの問題は、値のネイティブデータ型が時々DATETIMEまたは多分TIMESTAMP、そして時にはINT、時にはVARCHAR(255)で、ある

instance_id 
field_id 
value 

を含む、このmodel_field_valueテーブルを持っています。

そして、あなたは時々、例えば、暦年2017年に起こったDATETIME値を見つけるために、この1

SELECT fv.instance_id 
    FROM model_field_value fv 
    WHERE fv.field_id = something 
    AND fv.value >= '2017-01-01' 
    AND fv.value < '2018-01-01' 

ようなクエリを実行する必要があります。

これは、一般的に、必要なもののようなキー/値の格納を伴う首の痛みです。私の例のようなクエリをsargableにするには、DATETIMEカラムにインデックスを置く必要があります。しかし、あなたはそのような列を持っていない場合は、それをインデックスすることはできません。ダー。

ここに提案があります。あなたのテーブルにこれらの列を与えます。

instance_id  INT pk fk 
field_id   INT pk fk 
value   VARCHAR(255) a text representation of every value. 
value_double  DOUBLE  a numeric representation of every numeric value, or NULL 
value_ts   TIMESTAMP  a timestamp value if possible, or NULL 

この表には冗長なデータが含まれているため、正しく書かれているかどうかは非常に注意する必要があります。しかし、value_tsvalue_doubleカラムにインデックスを付けることができるので、これらの種類のクエリを可能にすることができます。

単なるアイデアです。

関連する問題