현재 일부 속성이 있거나 없을 수있는 동적 데이터 개체를 모델링하려고합니다 (속성 이름은 현재 요구 사항에 대해 알려져 있음). 나중에 새 속성을 추가할지 여부는 알 수 없습니다 (그러나 거의 확실합니다). 모델링 된 객체는이 라인을 따라 뭔가 :많은 NULL이있는 데이터에 대한 테이블 구조
int id PRIMARY KEY NOT NULL;
int owner FOREIGN KEY NOT NULL;
Date date NOT NULL;
Time time NOT NULL;
Map<String,String> properties;
속성은 모든 유형 (INT, 부울, 문자열, ...)
나는이 모델링하는 방법을 잘 모르겠어요이 될 수 있습니다 SQL 데이터베이스의 개체. 이 작업을 수행 할 수있는 두 가지 방법이 있으며 개발자 "작업"(유지 관리), 메모리 소비 및 성능면에서 더 나은 선택이 될 수있는 몇 가지 정보를 원합니다. 부울 정보 : 속성은 거의 항상 NULL (존재하지 않음)입니다.
(1) ID, 소유자, 날짜, 시간 및 모든 속성이있는 열이없는 큰 테이블은 열 속성이없는 반면 NULL로. 예 :
TABLE_X
id|owner|date|time|prop_1|prop_2|prop_3|...
이 테이블에는 많은 NULL 값이 있습니다.
새로운 속성을 첨가해야 내가 ALTER 표를하고 여기에
내가이 "보통"을 할 것마다 새 속성에 대한 새 열을 삽입 할 경우
SELECT * FROM TABLE_X ...
(2) 내가 것
TABLE_X
id|owner|date|time
을 그리고 다음과 같이 모든 속성에 대해 별도의 테이블이 있습니다 : 모든 NOT NULL 데이터를 메인 테이블이
TABLE_X_PROP_N
foreign_key(TABLE_X(id))|value
여기에는 전혀 NULL 값이 없습니다. 속성이 값을 갖고 해당 테이블에 있거나 값이 NULL이고 해당 테이블에 나타나지 않습니다.
새 속성을 추가하려면 다른 테이블을 추가하면됩니다. 여기
질문 (그래서 당신은 스크롤 할 필요가 없습니다) 반복하려면
SELECT * FROM TABLE_X LEFT JOIN TABLE_X_PROP_1 ON ... LEFT JOIN TABLE_X_PROP_2 ON ...
할 것입니다 : 유지 보수 측면에서 더 나은 문제를 다루는 boths 방법 (개발자 용), 메모리 소비 (디스크) 및 성능 (초당 쿼리 수)? 어쩌면 당신도이 문제를 어떻게 처리 할 수 있을지 더 잘 알고있을 것입니다. 미리 감사드립니다.
arturros에 대한 내 코멘트와 비슷한 답변 내가 TABLE_HEADER에 ID에 대한 여러 속성을 가지고 특정 속성 값을 검색하는 방법을 모르겠습니다. 시각적으로 * I * LEFT JOIN 일 때 시각적으로 서로 옆에 있지만 DB 엔진이이를 수행 할 때도 마찬가지입니까? 열이 무작위 순서가 될 수 없습니까? 예 : id1 | owner1 | date1 | id1propValue1 | id_propName1 | id1 | value1 | id_propName2 | name2 | id_propValue2 | id_propName2 | id1 | value2 ->이 결과에서 prop_2의 값을 얻는 방법 ? – Nogiax
@Nogiax - 개체 구조 (Map properties;)는 속성 봉, 즉 행에 속성을 보유하려는 것을 나타냅니다. 이 옵션은 옵션 2에 적합합니다. 여기서는 조인을 수행하지 않고 대신 머리글과 속성에 대해 2 개의 작은 쿼리를 수행한다고 가정합니다. 논리는 모두 데이터베이스가 아닌 코드에 있습니다. 속성을 조인하여 단일 행 즉 속성을 열로 사용하려는 경우 옵션 1을 사용하면 훨씬 쉽게 쿼리 할 수 있으므로 옵션 1을 사용할 수도 있습니다. –
Daniel
설명해 주셔서 감사합니다. 귀하의 접근 방식은 합리적인 것으로 들립니다. 내가 후속 질문 : 만약 내가 TABLE_HEADER에서 모든 행을 선택하고 검색된 행의 수는 X 될 것입니다. 그럼 모든 행에 대한 속성을 얻고 싶습니다.Wouln'td는 모든 객체에 대한 모든 속성을 가져 오기 위해 X 요청을 추가로 수행합니다 (모든 데이터에 대해 1 + X 쿼리를 수행합니다). – Nogiax