2009-12-18 7 views
1

음악 앨범의 많은 레코드가있는 테이블을 나타 내기 위해 MVC 패턴을 사용하고 있습니다. 각 음악 앨범에는 속성 (장르, 아티스트, 평점 등)이 있습니다. 각 속성은 여러 값을 가질 수 있습니다 (예를 들어 한 앨범의 장르는 "팝"과 "라틴"둘 다 가능합니다). 그 속성 값을 표를 사용하여 표현하고 싶습니다.레코드에 여러 특성을 할당해야합니다. 하나의 테이블 또는 여러 테이블을 선택해야합니까?

내가 생각할 수있는 두 가지 기본 접근 방식이 있습니다. 어떤 접근 방식이 더 좋은지 궁금합니다.

  1. 각 속성에 대해 별도의 테이블을 가지고 (예컨대, GENRE, ARTIST). 각 테이블의 열은 album_id 및 attr_value입니다.

  2. album_id 및 값 외에도 속성 이름 ("genre", "artist"...)을 포함하는 단일 테이블 ATTRIBUTES이 있습니다. 일반적으로

나는 방법 1 (관계형 DB 및 모든)을 선택하는 것입니다,하지만 난 방법 2를 선택하면, 내 생각이 나는 새로운 속성을 추가 할 때, 나는를 만들 필요가 없다는 것입니다 새로운 모델, 컨트롤러 및 뷰.

의견이 있으십니까?

답변

2

MVC 문제가 정규화 문제가 아닙니다.

데이터베이스를 정규화하고 엔티티 (테이블)를 설정하는 프로세스가 있습니다.두 가지 일반적인 형식은 3 표준 형식 또는 보이스 -Codd 표준 형식입니다. 둘 중 하나를 검색하면 충분한 정보를 제공해야합니다. 표준 정규화 외에도 사용할 수있는 몇 가지 다른 디자인이 있습니다. 이 모든 것은 오류 (업데이트/삽입)와 성능의 균형을 어떻게 유지할 것인가에 달려 있습니다. 많은 사람들이 비 관계형 디자인 (nosql, couchdb 및 빈 열로 인한 손상에 대한 오래된 우려가 오늘날 불필요하다고 생각하는 사람들)을지지합니다. 그렇다면 일련 화 된 배열이 하이브리드 디자인의 가능성을 열어 놓는 현실이 있습니다. EAV (엔티티 속성 값)와 추가 테이블을 논쟁하는 것처럼 보입니다. EAV는 느린 디자인이라는 명성을 얻었지만 입력 장치가 미리 알지 못할 때 정말 유용합니다. EAV에서 아티스트가 있고 "열"고향을 추가하고 싶다면 속성 테이블에 단순히 새로운 항목 인 열의 새로운 표를 만들어야합니다. EAV는 또한 검증하고 유형을 지정하기가 어렵다고합니다.

내 제품에서는 안전하게 재생하고 관계형으로 이동합니다 (Boyce-Codd 양식). 그렇습니다. 더 많은 모델과 더 많은 관계를 의미하지만, 몇 시간의 가치가 있습니다. 태그가 붙은 Cakephp와 같은 MVC 프레임 워크 외에도 모델을 만드는 것이 훨씬 쉬울 수 있습니다. EAV를 사용할 때마다 여분의 시간을 계획하기를 바랬습니다.

1

옵션 3 : 분명하고 가장 널리 사용되는 속성에 대한 전용 테이블을 사용하고 (예 : "전 아내가 얼마나 짜증".) 사용자 정의 속성에 대한 또 다른 일반적인 테이블이

이는 일한다고 정적 테이블에 대한 꽤 정적 인 속성 세트.

+0

이미 일반 테이블이있는 경우 모든 용도로 사용해야하지 않는 이유는 무엇입니까? – Sleepster

+0

성능을 향상시키고 유효성을 효과적으로 제어 할 수 있습니다. 물론 올바른, 정규화 된 형식이기 때문입니다. –

0

언제나 가능한 한 - 하나의 테이블을 사용하여 '진짜'를 표현하고, 두 개의 다른 아이디어/물체/사물을 관련시켜야 할 때처럼 여러 테이블을 사용합니다.

우리 모두는 # 1 아이디어를 사용하는 데 동의하지만, 이제는 새로운 속성을 추가 할 수 있기를 원합니다. 이것은 대개 '메타'테이블 - 개체와 속성의 실제 관계를 추상화하는 테이블 - 사용자가 원하는 것을 제공합니다 - 동적 속성으로 가장 쉽게 처리됩니다.

지금의이

======================= 
Table Name: Albums 
----------------AlbumID 
----------------GenreID --> foriegn key --> Genre in Genre Table 
----------------ArtistID --> foriegn key --> Artist in Artist Table 
----------------Name 
----------------Etc (attributes that you know you will need) 
======================= 
Table Name: AlbumMeta 
----------------AlbumID 
----------------Key 
----------------Value 
======================= 

처럼 보일 수 있습니다 - 앨범 콘크리트 속성을 가질 수있다 (예 : 모든 앨범을 가지고 속성)과 새로운 비즈니스 규칙이 올 경우에만 인디 앨범 말 - 당신은이 귀하의 새로운 파트너 사이트 "indiealbums.com"에 링크 - 인디 음악의 장르에있는 각 앨범의 AlbumMeta 항목을 만들 수 있습니다 ...

0

나는 앨범과 장르를 별개의 두 모델로 취급 할 것입니다. 그런 다음 각 속성/모델에 대한 테이블과 그 사이의 관계를 매핑하는 다른 테이블을 만들 수 있습니다. 데이터베이스 구조는 다음과 같이 보일 것입니다 :

===== 
Table: Albums 
-- id 
-- name 
-- artist 

==== 
Table: Genres 
-- id 
-- name 

==== 
Table: Album_Genres 
-- id 
-- album_id 
-- genre_id 

는 그냥 앨범이 Album_Genres 테이블에 새 행을 만들 특정 장르에 속한 상태로 한 후 관련 테이블에 모든 앨범과 장르를 추가 할 수 있습니다. 나중에 여러 속성을 추가/삭제해야 할 경우 몇 개의 테이블을 생성/삭제하는 것처럼 간단합니다.

+0

좋은 점 - 조회 테이블이어야합니다. – Skawful

0

이 정보를 입력 처음 조금 더 많은 작업 을 의미

<?php 
    class Album etends AppModel 
    { 
     public $name = "Album"; 
     public $hasAndBelongsToMany = array('Artist', 'Genre'); 
    } 
?> 
<?php 
    class Artist extends AppModel 
    { 
     public $name = "Artist"; 
     public $hasAndBelongsToMany = array('Album'); 
    } 
?> 
<?php 
    class Genre extends AppModel 
    { 
     public $name = "Genre"; 
     public $hasAndBelongsToMany = array('Album'); 
    } 
?> 

// fields for the tables with their table names 
// only the required ones for the relationships rest is up to you 
artists 
    --id 

albums 
    --id 

genres 
    --id 

albums_artists 
    --id 
    --album_id 
    --artist_id 

albums_genres 
    --id 
    --album_id 
    --genre_id 

.. 당신이 사용하는 제 3 정규형에게 당신이 찾고있는

CakePHP의에서

관계 배송을해야하고 필요한 필드는 . 장르와 아티스트의 항목을 데이터베이스에서 별도의 작업으로 처리해야합니다. 아티스트를 전체 "밴드"또는 개별 연주자로 취급하기로 결정하면이 설정으로 앨범을 임의의 그룹의 아티스트와 연결할 수 있습니다.