2017-03-16 4 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 :

,617 일부 필드

(복수 선택 드롭 다운에 대한 같은)

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

또한있을 수있는 많은 values문제는 : 나는 다른 유형의 데이터 (텍스트, 날짜, 정수를 저장할 때문에 valuetext 필드 항상)이 표에는 모든 모델의 모든 인스턴스에 대한 모든 값이 들어 있습니다.

예를 들어, 모든 모델에 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 for 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

주 : 200,000 개의 행 (메가 로우의 2/10)은 보통의 MySQL 작동에서 중간 크기의 테이블입니다. 일반적으로 그러한 테이블을 상당히 효율적으로 인덱싱하는 것이 가능합니다. http://use-the-index-luke.com/

내가 말하길, 내가 라고 생각하면 나는 당신의 문제를 이해합니다. 그것은 객체 지향 디자인, 다형성의 특수 용어입니다.

당신은 포함이 model_field_value 테이블이

instance_id 
field_id 
value 

귀하의 문제는 값의 기본 데이터 유형은 가끔, 가끔 DATETIME 아니면 TIMESTAMP, 때로는 INTVARCHAR(255)입니다이다.

그리고 당신은 가끔이 하나

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' 

예를 들어 올해 2017 달력에서 일어난 DATETIME 값을 찾을 같은 쿼리를 수행해야합니다.

이것은 일반적으로 목에 통증이 있으며 키/값 저장이 필요한 것과 같습니다. 내 예제와 같은 쿼리가 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 열에 인덱스를 넣을 수 있으므로 이러한 종류의 쿼리를 사용할 수 있습니다.

아이디어 만 있습니다.

관련 문제