2016-12-21 6 views
2

간단한 음악 데이터베이스 디자인을 이해하려고합니다. 외래 키와 기본 키만 포함하는 일부 테이블이 있습니다. 나는 어떻게 그리고 언제 이들 테이블을 사용할 것인지, 어떤 테이블에 삽입 할 지 모르겠습니다. 디자인은 다음과 같습니다기본 및 외래 키만 포함하는 데이터베이스 테이블의 용도는 무엇입니까?

Track: 
     id primary key 
     title 
     duration 
     live-performance (true or false) 
     year 

Artist: 
     id primary key 
     name 

ArtistTrack: 
     id primary key 
     artistID 
     trackID 

Album: 
     id primary key 
     title 

AlbumTrack: 
     id primary key 
     albumID 
     trackID 
     track-number 

Genre: 
    id primary key 
    name 

GenreTrack: 
    id primary key 
    genreID 
    trackID   

나는 Artist 테이블에 Track 테이블에 트랙과 아티스트를 삽입 할 경우 예를 들어, 나는 다음 ArtistTrack 테이블에 무엇을 삽입해야합니까? ArtistTrack 테이블의 속성이 각 테이블의 기본 키와 동일한 숫자라고 가정합니다.

나는 이것과 유사한 몇 가지 디자인을 보았고 나는 그것을 얻지 못했습니다. 외래 키가 테이블을 함께 연결한다는 것을 알고 있습니다. 누군가이 테이블을 사용하는 방법에 대한 예제를 줄 수 있습니까?

+2

일부 테이블은 'many to many'관계에서 '링크 테이블'입니다. 즉 앨범에있는 한 명 이상의 아티스트 (아티스트 - 앨범 링크 테이블). 또는 트랙에있는 한 명 이상의 아티스트. 트랙에는 해당 트랙에서 연주 한 각 아티스트에 대한 항목이 있습니다. –

+0

SQL과 유사한 데이터베이스, 즉 NoSQL에 데이터를 저장할 수 없으며 스키마가 매우 다르게 보일 수 있습니다. –

답변

3

ArtistTrack 테이블은 M : N 관계를 나타내는 고전적인 방법 인 접합 테이블입니다. Artist 테이블에 trackId에 대한 참조를 넣으면 각 아티스트가 (최대로) 하나의 트랙을 가질 수 있음을 의미합니다. 이 데이터베이스가 하나의 히트 불가사의를 관리하는 데이터베이스가 아니라고 가정하면 이는 잘못된 것입니다. Track 테이블에 artistId에 대한 참조를 넣으면 각 트랙을 (최대) 한 명의 아티스트가 구성 할 수 있습니다. 이 데이터베이스에서 공동 작업을 허용하려면 잘못된 것입니다.

솔루션은 ArtistTrack 테이블을 가지고 있습니다.이 테이블은 관련 아티스트 및 트랙에 대한 참조가 있습니다. 예 :

-- Insert the track: 
INSERT INTO Track VALUES (1, 'some track', 10, false, 1999); 

-- Insert a couple of artists: 
INSERT INTO Artist VALUES (1, 'Jay'); 
INSERT INTO Artist VALUES (2, 'Silent Bob'); 

-- Make them collaborate on this track 
INSERT INTO ArtistTrack VALUES (1, 1, 1); 
INSERT INTO ArtistTrack VALUES (2, 2, 1); 
0

이것은 매우 간단합니다. 샘플 데이터를 첨부했습니다. 도움이되는지 알려주고 알려주십시오.

enter image description here

2

는 데이터베이스를 만들 수있는 방법이 될 것입니다, 그리고 것은 이러한 유형의 보편적 인 규칙이 없습니다. 응용 프로그램의 필요성과 사용중인 데이터베이스 소프트웨어의 유형에 따라 데이터를 다르게 저장할 수 있습니다.

하는 새를 입력하는 경우 : 당신이 기존의 관계형 데이터베이스에 대한이 테이블 디자인을 사용하고자한다면

말했다되는 것을, 당신은 당신이 언급 한 아티스트 트랙 상황에 ​​대해 다음과 같이 그것을 아마 것 새로운 아티스트와 트랙은 관련 데이터 (제목, 기간, 라이브 퍼포먼스, 연도)와 함께 새 트랙을 입력 한 다음 관련 데이터 (이름)가있는 아티스트를 입력합니다. 그런 다음 아티스트를 트랙과 연결하려면 ArtistTrack 테이블에 primary_id (무작위 및 고유 키)와 아티스트 ID 및 trackID의 외래 키가있는 행을 추가합니다. ArtistTrack의 외래 키는 방금 입력 한 트랙 및 아티스트의 기본 키입니다.

많은 아티스트가있는 트랙과 많은 트랙이있는 아티스트의 잠재력을 허용하기 위해 테이블을 구조화했다고 추측합니다. 이 두 엔티티 간의 다 대다 관계로 인해 트랙과 아티스트에 대한 연결을 쉽게 찾을 수있는 브리지 또는 연결 테이블 (ArtistTrack)이 있습니다.

+0

또한 훌륭한 설명, 감사합니다. – datamoose

1

'GenreTrack'또는 'AlbumTrack'과 같이 궁금한 표는 다음과 같은 방법을 저장하는 데 사용됩니다. 트랙과 장르가 결합되어 각각의 트랙이 어떤 앨범에 들어 있는지를 보여줍니다. 이는 정규화 된 데이터베이스에 n : m 관계라고하는 일반적인 저장 방법입니다. GenreTrack을 예로 들어 보겠습니다. 말 표 "장르는"다음이 포함

id  | name   | 
    G1 | Rock   | 
    G2 | Blues  | 
    G3 | Pop   | 

와 "트랙"은 다음과 같습니다

id | title     | duration | live | year 
    T1 | "Pictures of You"  | 7:68  | FALSE | 2006 
    T2 | "A Song for the Lovers | 5:25  | FALSE | 1999 

지금 당신이 트랙에 장르를 할당하는 방법에 유연하게합니다. 어쩌면 "연인을위한 노래"를 "팝"과 "록"노래로 나누고 싶을 수도 있습니다. 결국 장르는 어느 정도 논쟁의 여지가있다.

그래서 "트랙"테이블의 간단한 외래 키는 여기에서 도움이되지 않습니다. 이것을 별도로 보관해야합니다. 그리고 이것은 "GenreTrack"테이블이 작동하는 곳입니다. "트랙"과 "장르"의 모든 조합을 유지합니다. 거기에 항목은 다음과 같을 수 있습니다 : 이제

id | genreID |trackID 
GT1 | G1  | T1 
GT2 | G3  | T2 
GT3 | G1  | T2 

, 당신은 궁금 할 것이다이 테이블은 자신의 "ID"열 갓 이유. 사실 "genreID"와 "trackID"를 사용하여 복합 기본 키를 형성 할 수 있기 때문에이를 정규화 된 테이블로 만들 필요가 없습니다. 그러나 일부 데이터베이스 프레임 워크는 복합 키를 지원하지 않으며 모든 테이블에 대리 키가 필요합니다. 이는이 "id"열의 이유 일 수 있습니다.

이 데이터를 선택하면 정직이 결과

SELECT t.title, t.year, g.name as genre_name 
FROM 
    "Tracks" t 
    left outer join "GenreTrack" gt 
    on t.id = gt."trackID" 
    left outer join "Genre" g 
    on gt."genreID" = g."id"; 

:

Title     | Year | Genre 
"Pictures of You"  | 2006 | Rock 
"A Song for the Lovers" | 1999 | Rock 
"A Song for the Lovers" | 1999 | Pop 

희망 당신에게이 m에 대한 아이디어를 제공한다 : n 개의 테이블을.

+0

위대한 설명. 복합 키에 대해서도. – datamoose

관련 문제