2012-11-14 1 views
1

나는이 비슷한 스키마가있는 경우 : 그것은 좋은 생각다른 대다 테이블에 다 대다 테이블에서 행을 참조하기 위해 그것을 나쁜 생각인가

TABLE 1 
id 
column 
other_column 
etc 

TABLE 2 
id 
table1_id 
some_other_table_id 

인가를 이 같은 세 번째 테이블을 추가 :

TABLE 3 
id 
table2_id 
row_from_another_table_id 

편집 :
이 상황이 명확하게이 같은 스키마 고려해야 할

EVENTS 
id 
name 
other_stuff 

RANGES 
id 
time_from 
time_to 
max_people 
etc 

EVENTS_PLACES 
id 
event_id 
place_id 

내가 원하는 것은 이벤트의 시간 범위를 정의하는 것입니다. 그러나 특정 장소 (EVENTS_PLACES)의 특정 이벤트는이 범위를 '덮어 쓸'수 있습니다. 또한 이벤트에는 여러 범위가있을 수 있습니다.

이 질문이 지금 조금 더 분명해지기를 바랍니다.

+1

우리는 많은 관계에서 그림으로 나타나는 접합 표라고 부릅니다. –

+0

@NiladriBiswas : 질문 : 다른 표의 접합 표에서 한 행을 참조하는 것이 좋은 생각입니까? – undefined

+0

나는 당신의 데이터베이스 설계에 달려 있으며 당신이 만나는 것을 필요로한다고 말한다. 이것을 할 수 있습니다. 이전에 본 적이 있지만 정확히 무엇을하려고합니까? 아니면 그냥 hypthetical 질문입니까? – marvin

답변

2

항상 많은 관계가 위반이라는 것은 내 생각에 Boyce-Codd Normal Form이며 좋은 관계형 데이터베이스 스키마를 위반합니다.

따라서 링크 테이블에 데이터를 연관시키는 것은 실제로 BCNF를 달성하는 데 필수적이므로 유용합니다. 데이터 업데이트 이상을 피하는 것이 좋다면.


제시 한 구체적인 스키마 예제를 참조하십시오.나는

----------------------- 
EventClass 
----------------------- 
Id 
Name 
... Other attributes common to every instance 
- 
----------------------- 
TimeSlot 
----------------------- 
Id 
Start 
End 
- 
----------------------- 
Place 
----------------------- 
Id 
Name 
Address 
MaxAttendance 
... etc 
- 
---------------------- 
EventInstance 
----------------------- 
Id 
EventClassId 
TimeSlotId 
PlaceId 
PresenterName 
...Other attributes specific to the instance 

EventInstance

가 realtionship EventClass, TimeSlotPlace 사이에 EventInstance에 특정한 어떤 속성이 엔티티에 보관해야합니다, 당신은 이러한 논리적 테이블 (또는 단체)을 원하는 생각합니다. 관련된 이벤트 그룹에 공통 인 속성은 EventClass 속성에 저장되어야합니다. Database Normalization


그 모든 질문은 일반적으로 데이터가 더 이상 정규화, 말하기. 그러나 성능이 문제가되는 경우 타협이 필요한 경우가 있습니다. 원하는 데이터가 출력 형식으로 저장되어 있으면 업데이트가 지옥 일지라도 선택한 쿼리가 더 간단하고 빠릅니다.

올바른 Indecies 인 Materialized Views과 indecies가 Materialized Views 인 경우, 두 가지 장점을 모두 활용하여 문제를 해결할 수 있습니다. 성능의 속도로 완전히 정규화 된 데이터의 유지 보수성. 스키마를 올바르게 사용하려면 약간의 기술과 고려가 필요합니다.

+0

내 생각에, 이벤트는 "기본"타임 슬롯으로 정의되며 이벤트 인스턴스에 다른 타임 슬롯이있는 경우에만 언급해야합니다. – undefined

+0

링크를 이용해 주셔서 감사합니다. – undefined

+0

@xyu 데이터베이스에 기본 시간대가있을 필요는 없습니다. 또는 'Id'가 '1'인'TimeSlot'으로 추가하고''EventInstance.TimeSlotId'''에'DEFAULT CONSTRAINT '를 넣고'NOT NULL' 컬럼을 만들 수 있습니다. 어느 쪽이든, 그것의 구현 세부 사항 및 엔터티 관계 다이어그램 또는 논리적 디자인의 일부가 아닙니다. – Jodrell

1

속성이있는 두 테이블 사이에 관계가 있으며 더 많은 속성이있는 해당 하위 클래스가 있습니다. 드문 일이지만 가능합니다.

일부 다처제 데이트 사이트에서 하나 이상의 여성 엔터티가 하나 이상의 Man과 관계가 있다고 가정합니다. 이 두 테이블은 관계 테이블과 연결될 수 있습니다. 이제 그들 중 일부는 결혼했고, 당신은 특별한 유형의 관계를 고려합니다. 그래서 Marriage는 Relationship의 하위 클래스이고, Marriage 테이블은 Relationship 테이블의 id에 대한 참조를 가지고 있습니다.

물론 상황을 다른 방법으로 해결하는 것이 더 간단 할 수 있습니다. 예를 들어 남자와 여자 사이에 두 개의 교차 테이블을 간단하게 배치하는 것이 더 쉽습니다. 그러나 접합점 테이블의 관계를 확장하려는 상황이 분명합니다.

+0

그래, 내가 상황에있어, 내가 접합점 테이블을 확장하고 싶지만, 질문은 : 이것은 좋은 생각인가? – undefined

0

또 다른 옵션은 "사물"간의 연결 특성을 설명하는 열을 TABLE2에 추가하는 것입니다. 예를 들어 PERSON 테이블과 RELATIONSHIPS 테이블은 첫 번째 테이블에서 "개체"를 모델링 한 다음 초 단위로 "링크"를 모델링합니다. 적절한 지표와

+---------+---------+-------+--------+ 
| link_id | from_id | to_id | type | 
+---------+---------+-------+--------+ 
|  1 |  2 |  3 | Mother | 
|  2 |  8 |  3 | Sister | 
+---------+---------+-------+--------+ 

이 주어진 사람에 대한 모든 관계를 찾거나이 간단한 예이다 등의 여동생을 가지고 모든 사람을 찾을처럼 당신이 일을 할 수 있다는 것을 의미하지만, 흥미로운 얻을 시작할 때 from_id 및 to_id는 사람뿐만 아니라 다양한 유형의 객체가 될 수 있습니다.

나는 다양한 접근 방식의 데이터를 집계하고 유연해야만하는 매우 일반적인 스키마로 작업 할 때이 접근법을 사용했습니다. 분명히 유연성과 예를 들어 속도, 쿼리 복잡성. 귀하의 경우에 유용할지 여부를 결정해야합니다.