동적 항목에 관한 데이터베이스 설계 - 한 행입니까, 아니면 여러 행입니까?

StackOverflow https://stackoverflow.com/questions/262361

  •  06-07-2019
  •  | 
  •  

문제

나는 사이드 프로젝트를 위한 데이터베이스 스키마를 디자인하려고 노력했지만 마음에 드는 것을 생성할 수 없었습니다.데이터 액세스를 위해 LINQ와 함께 ASP.Net을 사용하고 있습니다.

사용자가 각각 2개의 숫자 속성과 1개의 참조 속성인 항목 이름을 사용하여 최대 10개의 "항목"을 지정할 수 있도록 허용하겠습니다.

이 항목을 1개의 행에 넣으면 약 30개 이상의 열(최소)과 쉽게 동일해집니다.item_1_name (ref) item_1_weight item_1_volume item_2_name ...등...

그리고 각 속성의 범위는 본질적으로 1에서 400+까지일 수 있으므로 이러한 열을 참조 테이블로 간단히 바꿀 수는 없습니다.

또한 사용자가 항목에 1개의 항목만 넣기로 결정한 경우 해당 데이터에 대한 개체를 만드는 방법은 LINQ와 같이 정적일 것이며 속성과 기타 항목이 NULL인지 확인하고 그에 따라 작동해야 한다는 것을 알았습니다. .또한 항목에 허용되는 항목 수를 늘리고 싶다면 작업하기가 어려울 것입니다.

제가 생각한 또 다른 옵션은 단순히 각 항목에 대한 행을 만들고 이를 항목 ID와 연결하는 것입니다.따라서 본질적으로 null 항목은 없지만 테이블은 천문학적으로 깊어지지만 그다지 넓지는 않습니다. 왜냐하면 홀수 열이 5개 정도 밖에 없기 때문입니다.

내 디자인에서 내가 간과하고 있는 것이 있습니까/이 작업을 수행하는 훨씬 더 좋고 효율적인 방법이 있습니까?

편집하다:내가 천문학적으로 성장할 것이라고 말하는 것은 다음과 같은 의미입니다.사용자는 항목을 만들 수 있으며 각 항목에는 항목 그룹이 있을 가능성이 높습니다.따라서 사이트에 하루에 한 번 항목을 입력한다고 가정하면 항목 그룹 3개를 가질 수 있으며 최대 항목 수(10)는 단일 항목에 대한 항목 30개와 동일합니다.해당 비율로 일주일 동안 매일 항목을 작성하면 해당 단일 사용자에 대해 210개의 행을 가질 수 있습니다.

도움이 되었습니까?

해결책

언급한 후자의 디자인을 권장합니다. 5개의 열이 있는 하나의 종속 테이블을 만듭니다.

CREATE TABLE Items (
  user_id               INTEGER NOT NULL,
  item_id               INTEGER NOT NULL DEFAULT 1,
  numeric_property1     INTEGER,
  numeric_property2     INTEGER,
  referential_property  INTEGER,
  PRIMARY KEY (user_id, item_id),
  FOREIGN KEY (user_id) REFERENCES Users(user_id)
                        ON DELETE CASCADE,
  FOREIGN KEY (item_id) REFERENCES num_items(item_id),
  FOREIGN KEY (referential_property) REFERENCES some_other_table(some_column)
);

나는 테이블을 보여줍니다 num_items 위의 항목에는 사용자를 최대 10개의 항목으로 제한하려는 경우 1부터 10까지의 숫자가 포함되어 있습니다.

CREATE TABLE num_items (item_id INTEGER NOT NULL );
INSERT INTO num_items (item_id) 
  VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10);

이 디자인의 장점은 쉽게 만들 수 있다는 것입니다. COUNT() 특정 사용자가 얼마나 많은 항목을 가지고 있는지, 다음과 같은 것을 쉽게 계산할 수 있습니다. MIN() 그리고 MAX() 특정 속성에 대해 참조 속성 등에 대한 외래 키를 적용할 수 있습니다.

일부 데이터베이스에는 복합 기본 키(item_id 이 경우) 자동 증가하므로 값을 지정하면 entity_id 하지만 생략 item_id 사용되지 않은 다음 값을 자동으로 가져옵니다(단, 삭제해도 공백이 채워지지는 않습니다).어떤 브랜드의 데이터베이스를 사용하고 있는지 명시하지 않았으므로 이 기능을 파악하는 것은 여러분의 몫입니다.

편집하다: Tony Andrews가 답변에서 말했듯이 행 수는 문제가 되지 않습니다.어떤 브랜드의 데이터베이스를 사용하려는지는 명시하지 않지만 MS Access와 같이 특별히 취약한 제품을 선택하지 않는 한 데이터베이스를 사용하여 수백만 행을 쉽게 처리할 수 있습니다.인덱스를 잘 선택하고 해당 인덱스를 사용하는 쿼리를 작성하면 효율성이 문제가 되지 않습니다.

다른 팁

단일 항목 테이블 사용 :

userId, itemindex, isreference, numericvalue, referenceValue

이런 식으로 사용자 999의 item_3_name의 값은 다음으로 번역됩니다.

999,3, True, null, value

사용자 당 최대 항목 수 등 특정 제약 조건을 직접 시행해야합니다.

적절한 데이터베이스 디자인은 각 사용자/항목을 별도의 행에 저장하는 것입니다. 이는 작업하기가 훨씬 쉽고 10 개 항목의 임의의 제한을 제거합니다. 나는 그것이 "천문학적으로 깊이"자랄 것이라고 말하지 않을 것입니다. 약 10 x (사용자의 사용자) 행이있을 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top