3

제목을 용서하십시오. 지나치게 서술하지 않고서도 문제를 해결하는 데 어려움이있었습니다.
연락처
속성
이벤트여러 데이터 세트에 대해 "메모"테이블을 구성하는 올바른 방법은 무엇입니까?

내가 메모를 부착하는 방법을 추가하고 위의 테이블에있는 항목에 :

내 응용 프로그램이가 좋아하는 테이블이 있습니다. 단일 메모가 연락처, 속성 또는 이벤트 (또는 세 가지 조합)와 연결될 수 있도록 노력하겠습니다.

현재 내 노트 테이블은 다음과 같습니다

noteID이
ContactID가이
을 int로
가 datatime
noteContent 텍스트
아이디의 INT (메모을 만들어 사용자 ID)를 noteCreated int로 propertyID int
eventID int

해당 부분은 굵게 표시됩니다. 지금은 이벤트에 대해 노트를 만들 때 노트를 삽입하고 이벤트 ID을 설정하기 만하면됩니다. 이벤트와 연락처가 인 경우 contactID도 추가 할 수 있습니다 (contactID 및 eventID가 설정 됨). 작동하는 동안, 나는 그것이 비효율적이고 적절하게 표준화되지 않았다고 생각합니다.

내가하려고하는 것은 일대 다 관계를 만드는 것이고, 문제는 "많은"부분이 다른 목표 테이블을 가질 수 있다는 것입니다. 동시에 메모를 선택하거나 삽입하는 데 필요한 쿼리 수를 줄이려고합니다.

내 생각 엔 이들을 서로 연결하는 테이블을 만든 다음 속성, 연락처 및 이벤트에 일정한 고유 한 targetType을 제공했습니다. 그러나 나는 여전히 그것이 최선의 방법이 아니라고 생각합니다. 또는 각 대상 테이블 (notes_properties, notes_contacts 등)에 대해 별도의 관계 테이블을 작성할 수 있습니다.

noteID INT
TARGETID INT
TARGETTYPE INT

많은 도움을 주시면 감사하겠습니다.사용에 가입 할 수 있습니다 다음

noteID 
noteCreated 
noteContent 
userID 
noteType (contact, property or event) 
RelatedID 

:

FROM Contacts C 
INNER JOIN Notes N on C.ID = N.RelatedID and N.noteType = 'contact' 

또는 당신이 정말로 나는이 같은 구조를 추천 할 것입니다 단일 테이블에있는 모든 노트를 유지하려는 경우

+1

이 질문에 답해 주셔서 감사 드리며 내가 가질 수있는 것보다 더 명확하게 말하십시오. 노트가 사용되는 방식에 따라 다른 솔루션을 사용하게 될 것입니다. 추가 된 복잡성으로 인해 가장 적은 번거 로움이 발생합니다. –

답변

3

단 하나의 노트 만 입력하면 연락처, 속성 및 이벤트 테이블에 단순히 noteID 열을 추가하는 것이 가장 좋습니다.

이 있다면 대다 관계, 예를 들면, 접촉이 많은 메모를 할 수 있습니다, 당신은 별도의 테이블을 만들려는 것, 말하는 두 개의 열 contact_notes - contactIDnoteID.

메모가 여러 항목에 연결될 수 있다는 사실에 신경 쓰지 마십시오. 실제로 모델링하는 방식에는 실제로 영향을 미치지 않습니다.

+0

그럼, 각각의 many-many 관계에 대한 테이블을 추가하기 만하면됩니다 (예 :'contact_notes','property_notes','event_notes')? 그리고 다른 미래의 테이블에 노트를 추가하고 싶다면 다른 중간 테이블을 추가하는 것만 큼 쉽습니다 :'venue_notes', 예. – mwolfe02

+0

+1 나는 당신의 대답이 내 것보다 낫다. – mwolfe02

+0

고마워, 에릭!이것은 내가 염두에 두었던 구조 중 하나이지만 너무 많은 테이블을 만드는 것을 다루고 싶지 않았습니다. 나는 또한 각각의 것들에 "파일"을 추가 할 것이다. 이것은 stackoverflow에 대한 나의 첫 번째 질문이며 나는 받고있는 놀라운 도움에 놀랐다. 고맙습니다! –

0

을 :) 감사 당신이 설명하고 무엇

FROM Property P 
INNER JOIN Notes N on P.ID = N.RelatedID and N.noteType = 'property' 
+0

이 접근 방식의 문제점은'Note' 레코드와 연결된'Contacts' 또는'Property' 레코드 만 볼 수 있다는 것입니다. 그들에게'Note'가 연관되어 있지 않으면 그들은 INNER JOIN으로부터 제외 될 것입니다. – mwolfe02

+0

사정을 악화시키기 위해서,'FROM contact C LEFT JOIN 노트 C.ID = N.RelatedID와 N.noteType = 'contact'n은 N도 작동하지 않을 것입니다. 당신은 실제로 이것을해야 할 것입니다 :'FROM C LEFT JOIN (SELECT * FROM CID = Notes.RelatedID and Notes.noteType = 'contact') N' 그것은 귀찮고 비효율적입니다. – mwolfe02

0

...

단일 메모가 연락처, 속성 또는 이벤트 (또는 세 가지 조합)와 연결할 수 있도록하고 싶습니다.

...은 연락처, 속성 또는 이벤트가 둘 이상의 노트를 가질 수 있고 네 개의 테이블을 처리하는 추가 복잡성을 가질 수 있다는 추가 가정을 통해 고전적인 다 대다 관계의 변형입니다. 두). 당신이 생각 지적하고,이 특정 쿼리를 작성하는 더 열심히하고 할 것

noteID int 
targetID int 
targetType int 

: 당신이 당신의 질문에 설명한대로

적절하게 그 상황을 정상화하는 방법은 필드 중간 테이블입니다 더 비효율적이다. 특히 외부 조인 (노트가 선택 적이기 때문에 거의 확실하게 필요함)은 하위 쿼리를 사용해야합니다.

I 좋겠 약간 비정규이 보이는 중간 테이블을가는 것이 좋습니다 : 메모와 연락처, 속성 & 이벤트 사이의 관계가 1 일에, 예를 들어, 연락처가 가질 수있는 경우

ID int   'autonumber to provide a reliable and efficient unique key' 
noteID int 
contactID int 'allow nulls' 
propertyID int 'allow nulls' 
eventID int  'allow nulls' 
관련 문제