대다

2010-02-05 2 views
4

당신이이 말 데이터베이스 설계 질문 다음 대다 테이블 관계 :대다

user 
----- 
id 
first_name 
last_name 

user_prefs 
---------------- 
id 
preference_name 

user2user_prefs 
------------- 
id 
user_id 
user_pref_id 

하지만 "홈페이지"의 사용자 환경 설정을 실제 홈페이지를 저장하는 곳 필요하다고 url. 어디로 갈 것입니까?

user_prefs에 값을 입력 할 수 없습니다. 동일한 값이 해당 매핑을 가진 모든 사용자에게 적용될 수 있기 때문입니다.

user2user_prefs 
------------- 
id 
user_id 
user_pref_id 
value 

을하지만이 정상화의 측면에서 최선의 방법입니다 :

나는 그렇게 같이 user2user_prefs에 넣어 수 있습니까? 뭔가 그것을하고있는 방법에 대해 꽤 괜찮은 느낌이 들지 않습니다. (한 가지는 모든 환경 설정의 모든 값을 포함해야하기 때문에 새로운 "값"에 ENUM을 사용할 수 없습니다). 이견있는 사람?

감사합니다. Stabby L

답변

3

기능 의존성을 살펴 봐야합니다. 값은 사용자에 의존하지 않고 userpref에 의존하지 않지만 두 값 모두에 의존합니다. 제안한대로 user2user_prefs 타블렛에 배치해야 함을 의미합니다.

enum을 사용해야하는 경우 value 속성은 다른 테이블의 값을 조회 할 수 있습니다. 같은 값이 그 매핑을 가지고 모든 사람에게 적용되는 것이기 때문에

+0

이것은 내가 몰래 기대했다 대답 ... 감사합니다 ;-) –

1

나는 user_prefs 에 값을 넣을 수 없습니다.

너무 표준화 중입니다. 홈페이지는 user_prefs에서 괜찮을 것입니다. ,

user 
----- 
id 
first_name 
last_name 
homepage 
<other settings> 

외래 키 관계, 특히 다 대다 관계의 복잡성에 큰 비용이 : 내가 당신이라면

는 사실, 난 그냥 하나 개의 테이블을 사용하십시오. 소프트웨어 개발자의 임무는 복잡성을 통제하는 것입니다.

+0

는 여전히 말을 그 홈페이지는 서른 다른 사용자 환경 설정 중 하나라면? 그 테이블은 매우 크고 평평 할 것입니다. –

+0

큰 뚱뚱한 테이블에는 아무 문제가 없습니다. 질문은, 많은 관계가 추가되는 것은 무엇입니까? 균형을 맞추기 위해 두 디자인을 모두 사용하는 두 개의 간단한 클라이언트를 작성하십시오. 나는 당신이 many-to-many 관계를 명확히하는 것에 대한 경험을 발견 할 것이라고 생각한다. :) – Andomar

+0

many-to-many 디자인으로 얻고 자하는 이점은 다음과 같은 모든 다른 사용자 환경 설정을 제어하고 볼 수 있다는 것이다. 단일 테이블 (user_prefs). 나는 그 옵션을 한 곳에서 정의하는 것을 좋아한다. 그리고 같은 이유로 VARCHAR 대신에 ENUM을 미리 정의 된 값으로 사용한다. 필자는 코드 관리를 좀 더 단순하게 만든다고 생각합니다. 원래 게시물에서는 user_pref를 쿼리하여 모든 사용자가 사용할 수있는 모든 옵션을 볼 수있었습니다. 나는 그것을 사용자 테이블에 모두 넣으면 똑같은 것을 얻을 수 있다는 것을 알게되었습니다. 그래서 정규화에 대해 물었습니다 ... –

1

특정 유형의 가치가 실제로 많은 관계에 속하지 않는 것처럼 보입니다. 특정 속성 값이 각 사용자별로 다르면 별도의 테이블이어야합니다. user에서 각 사용자에게 고유 한 환경 설정을 가진 다른 테이블로의 1-many 관계가있는 것처럼 느껴집니다.

편집 : 1로 많은 표를 들면 :

user_specific_prefs 
------ 
id 
user_id 
pref_name (or possibly pref_id that indicates the type) 
pref_value (store www.myhome.com for example) 

USER_ID 단지 외부 키를 다시 특정 사용자에게 있습니다. 이것은 본질적으로 (논리적 인 의미에서) 사용자 테이블에 추가 열을 추가하는 것입니다. 그러나 Andomar가 지적했듯이, 그것은 복잡성을 더합니다. 그런 식으로 많은 수의 환경 설정이 있다면 일 수도 있고 일 수도 있습니다. 반면에 나는 수 백 개의 열이있는 테이블을 보았습니다. 나는 그것이 훌륭하다고 (그리고 나는 그것들을 만들지 않았다) 말하는 것이 아니라, 일을 끝내고 사용하기 쉽다.

+0

이것은 재미 있지만, 당신의 말을 이해할 수 있는지 확실하지 않습니다. 당신이 테이블을 만들 수있는 희망이 있습니까? –

+0

편집 해 주셔서 감사합니다. 이것은 원래의 설정에 가깝습니다. –

0

매우 가까이 있습니다.

[편집 : 내 이전에는 빛나는 대답이 그렇게 훌륭하지 않다고 생각했습니다.]

편집 테이블 :

users 
----- 
id 
first_name 
last_name 
preferences 

환경 설정 필드는 특정 사용자 옵션의 직렬화 된 객체 또는 배열을 개최한다. PHP에서 :

if (is_array($options) || is_object($options)) 
     serialize($options); 

Serialize Manual

+0

그런 환경 설정 테이블을 사용하면 원래 문제의 일부인 각 사용자에 대해 동일한 이름/값 쌍이 생성됩니다. –

+0

맞습니다. 색상 : 빨강, 색상 : 파랑, 색상 : orage. 흠 –