1
create table USERS ( 
    PK_USER int not null auto_increment primary key, 
    EMAIL varchar(100) not null, 
    PASSWORD char(40) not null 
); 

create table CIRCLES ( 
    PK_CIRCLE int not null auto_increment primary key, 
    CIRCLE varchar(45), 
    FK_CREATOR int, 
    foreign key(FK_CREADOR) references USERS(PK_USER)  
); 

create table MEMBERS ( 
    FK_MEMBERS int, 
    FK_CIRCLES int, 
    foreign key(FK_MEMBER) references USERS(PK_USER), 
    foreign key(FK_CIRCLE) references CIRCLES(PK_CIRCLE) 
); 

PK_USER에 대한 이중 참조를 갖는 것이 맞습니까? (. 심판에 대한 USERS = USUARIOS, MEMBERS = MIEMBROS, 원 = CIRCULOS, CREATOR = CREADOR) 나는 그들이 두 개의 서로 다른 역할을 재생하는«추론»수있는함으로써Google 서클과 같은 그룹의 올바른 데이터베이스 구현

+2

거기 * 자체 * 아무 문제가 없지만'MIEMBROS.FK_MIEMBRO'에 의해 참조되는'CIRCULOS.FK_CREADOR' 같은 경우'MIEMBROS.FK_CIRCULO' 다음은 [3NF]을 위반하는 것 (HTTP ://en.wikipedia.org/wiki/Third_normal_form). – eggyal

+0

나는 eggyal이 말한 것에 동의한다. 그러나 데이터 수가 증가 할 때 우리는 언젠가 비정규 화를 사용해야합니다. 내가 같은 목록에 작성자의 이메일을 넣을 때 –

+0

덕분에 이미 질의를하고 난 회원의 이메일 및 원 목록을 알고 싶다면, 예를 잘 작동, 나는 내부 2 조인을 사용,하지만 난 문제가 발생할, 무엇을 할 수있어? 이메일을 선택, 원, 내부 구성원 제작자 EMAIL합니다 (= FK_CIRCLE –

답변

0

: 당신이있어 CIRCULOS에서

  1. 을 당신은 그래서«회원»관계 (many-to-many 관계)

을 추적하는 MIEMBROS에서

  • 엔티티의 제공을 누가했는지 추적 : 당신은 확인을 제공하는 당신의 의도가 있었다 :)

    ,210
  • +0

    좋아, 답변 감사 그냥 이메일 (부재)를 얻을 수있는 부재 테이블을 이용하여 그 참조 원 PK_CIRCLE 원, 가입 PK_USER = FK_MEMBER 내부 사용자를 가입 의 이름),하지만 이메일 (회원), 이메일 (소유자), 동그라미와 쿼리를 원한다면 어떻게해야합니까 ?? –

    +0

    단일 스크립트 내에 두 개의 쿼리를 작성해야합니다. 첫 번째 멤버는 원과 관련된 HEAD 정보를 선택하고 두 번째 멤버는 멤버를 검색합니다. 모든 데이터베이스 액세스 라이브러리가 여러 레코드 세트에 액세스 할 수있는 수단을 제공한다고 생각하십시오. 또 다른 방법, 당신이 두 개의 출력 매개 변수와 레코드 집합을 반환하는 SP를 코딩하는 것, 저장 프로 시저를 사용하여 DB를 액세스 코드를 레이어에 머무는 것을 고려합니다. 또한 일부 DB 액세스 라이브러리는«계층 적 레코드 세트»와 같은 정교한 도구를 제공합니다. –

    +0

    순진한 용액 : SELECT C.CIRCLE, MEMBER_EMAIL AS = C.FK_CREATOR CROSS는 가입 사용자 U_MEM U_OWN INNER 서클을 U_OWN.PK_USERS ON C 가입 사용자 INNER 구성원 가입 FROM OWNER_EMAIL, U_MEM.EMAIL AS U_OWN.EMAIL M 는 U_MEM.PK_USER = M.FK_MEMBERS ON C.PK_CIRCLE = @PK_CIRCLE 종종«단일 쿼리»용액으로 하지만 나는 그것이 추한 의미 표준화되지, 매우 큰 결과 집합에 대한 성능이 좋은하지 찾을 어디 많은 양의 데이터가 불필요하게 복제됩니다. (쿼리를 테스트하지 않음) –