문제

나는 데이터베이스를 설계하고 있으며 하나에서 많은 관계의 필요성에 대해 생각하고있었습니다. 전통적으로 나는 정상적인 PK (안내서)를 수행하고 관계를 설정했지만 대신 PK로 약간의 플래그를 사용하지 않는지 궁금했습니다.

관계는 손실되지만 데이터 자체는 관계를 설명 할 것입니다.

예 - 그룹 테이블과 사용자 테이블이 있습니다. 사용자는 하나 이상의 그룹을 가질 수 있습니다.

+------------------------+
| Groups                 |
+------------------------+
| PK      | Display Name |
+---------+--------------+
| 1       | Group A      |
| 2       | Group B      |
| 4       | Group C      |
+---------+--------------+

+------------------------+
| Users                  |
+------------------------+
| Name    | Groups       |
+---------+--------------+
| Fred    | 1            | // Fred is only in Group A
| Jim     | 3            | // Jim is in Groups A & B
| Sam     | 7            | // Sam is in all Groups
+---------+--------------+

이 디자인에 대한 생각, 의견 및 제안 해주세요.

도움이 되었습니까?

해결책

나쁜 생각 ... 색인은 어떻게 작동합니까? 모든 값을 스캔하고 계산해야합니다 ...

Group X의 모든 사용자를 알고 싶다고 가정 해 봅시다. 매우 빠른 색인을 수행하는 대신 해당 그룹에 있는지 여부를 결정하기 위해 모든 행에서 기능을 실행해야합니다. .

편집 : 간단히 ... 그룹 B의 모든 사용자를 찾기 위해 테이블의 색인을 사용하는 쿼리를 작성하십시오.

다른 팁

나는 이와 같은 비트 플래그를 사용하지 않겠습니다. 우선, 당신은이 테이블에 쉽게 가입 할 수있는 능력을 위반하므로 그룹 멤버십을 결정하는 것은 a) 더 오래 걸리고 b) 더 어려워지고 c) 더 많은 정식 스캔 또는 최소한 색인 스캔이 포함될 수 있습니다.

당신은 숫자가 아주 빨리 떨어질 것입니다. 64 개의 그룹이있는 경우 이미 64 비트를 사용하고 있습니다. 나는 당신이 백만 개의 그룹이 있다면 어떻게 될지 생각하기 위해 떨었다.

이것의 또 다른 문제는 그룹을 삭제하면 조금 잃어 버렸다는 것입니다. 나중에 조금 재사용 할 수는 있지만 원하는 방식이 아닐 수도 있습니다.

좋은 생각, 관계형 데이터베이스에서 어떻게 이익을 얻을 수 있는지 알 수 없습니다. SQL이라면 표준 키를 사용해야한다고 생각합니다. 그렇지 않으면 비싼 스토리지의 요점은 무엇입니까?

아마도 각 테이블이 다른 파일에있는 파일 기반 스토리지에 더 적합 할 것입니다. 또는 추가 열로 표시되지만 기본 키를 넣지 마십시오.

PS 두 사용자가 같은 그룹에 있으면 넘어지지 않습니까?

라이언

좋은 IMO. 이것은 전형적인 다수의 관계입니다. PK가 32 비트보다 32 비트 인 경우 하나의 사용자가 최대 32 그룹에있을 수 있습니다. 디자인을 제한하는 이유는 무엇입니까?

// 샘은 모든 그룹에 있습니다.

디자인을 수정하고 PK 4 비트를 3으로 부여한다고 가정 해 봅시다. 이제 Sam은 "모든 그룹"에 있습니까?

이익은 무엇입니까?

쿼리 (조인)를 어떻게 작성 하시겠습니까? 이 디자인에 문제가있을 것이라고 생각합니다.

나는 최근에 기본 키로 사용 된 Guid가 최근에 상당히 조금씩 보았고 나는 그것이 끔찍한 생각이라고 생각합니다. Guid는 "Globally Cight ID"를 의미합니다. ".

실제로 전 세계적으로 고유 한 것이 필요한 경우 Guids를 사용해야 할 충분한 이유가 있지만 대부분의 데이터베이스 키는 해당 데이터베이스에 비해 고유해야합니다. 이 경우, 순차적으로 생성 된 정수 키는 종종 충분하며 자원 방식으로 훨씬 적은 소비를합니다. 실제로, 시퀀스 ID 나 안내서는 내재적 인 의미를 갖지 않으므로 실제로 문제의 개체를 실제로 기본 키로 식별하는 항목을 사용할 수있는 경우 (모든 항목이 말하는 학교가 있지만, 시퀀스 또는 안내와 같은 내용 독립적 키가 있어야합니다).

비트 필드에는 기본 키로 여러 부채가 있습니다. 언급했듯이 추가 비트가 필요하다고 결정할 수 있습니다. 충돌로 끝날 수 있습니다. 데이터베이스는 비트 기능이 좋지 않은 경향이 있으며 그때까지도 포복 할 수없는 경향이 있습니다. 마지막으로, 선택한 데이터베이스의 인덱싱 알고리즘은 비트 세트 키를 잘 최적화 할 수 없을 수 있습니다.

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