2009-08-26 4 views
2

내 일반적인 문제는 사용자가 사실상 여러 유형의 필드를 추가하여 항목과 연결할 수 있기를 원합니다. 그래서 고려하고 하나 개의 솔루션은 다음과 같은 : 사용자가 자신의 일부 항목에 매개 변수는 "생년월일"을 추가하고 싶어MySQL에서 ORDER BY COALESCE의 성능에 미치는 영향

table `items` 
item_id | name 

table `parameters` 
parameter_id | name | type 

table `values` 
item_id | parameter_id | datetimevalue | datevalue | integervalue | etc... 

경우, 우리는 매개 변수 테이블에 하나 개의 매개 변수, 다음 하나 개의 항목을 추가 그가이 매개 변수를 갖기를 원하는 각 항목의 값 표에서 datevalue 열에 날짜가 있고 다른 모든 'value'필드는 null로 남았습니다.

나는 BY이 순서는 성능이 좋은 것,

SELECT * from 
items 
join values on items.item_id = values.item_id 
join parameters on parameters.parameter_id = values.parameter_id 

where parameter_id = 1 
order by coalesce(values.datetimevalue, values.datevalue, values.integervalue...) 

내 특정 질문은 할 것, = 1 parameter_id 한이 매개 변수를 가정하여, "생년월일"로 자신의 항목을 주문하려면? 그것은 지표를 잘 활용할 수 있습니까? 불필요한 일을 할 것인가?

내 일반적인 질문은이 접근법이 좋은 습관입니까? 이 작업을 수행하는 더 좋은 방법이 있습니까?

답변

1

EAV 모델링에 대해 이야기하고 있습니다.

인덱스의 사용을 할 수 없습니다 EAV modelling

+1

고마워요! 그게 내가 말하는거야! 이런 식으로 COALESCE 명령을 사용하는 것에 대해 누군가가 말할 수 있다면 여전히 궁금합니다. –

0

COALESCE BY이 ORDER ...에서보세요. 숭배가 중요합니까? 단일 매개 변수를보고있는 경우 열의 순서는 모든 값이 같은 유형이기 때문에 충분합니다.

"ORDER BY datetimevalue, datevalue, integervalue"를 수행 한 경우이 쿼리는 (parameter_id, datetimevalue, datevalue, integervalue)에 대한 인덱스를 사용할 수 있습니다.

단점 : 1) 약간의 난제가 생깁니다. 2) 가치 열이 많고 값 테이블이 커지면 색인이 낭비되고 읽기/쓰기가됩니다.

값 테이블에 "sort_order"(또는 무언가) 열을 대신 추가하는 것이 더 나을 것입니다. 또한 서로 다른 유형의 값을 정렬하기 때문에 실제로 COALESCE가 필요한 경우 올바른 작업을 수행 할 sort_order 계산을 선택할 수 있습니다.

관련 문제