2017-12-30 25 views
0

나는 person 테이블과 score 테이블을 가지고 있습니다. Person 테이블에는 기본적으로 사람의 정보가 저장되는 반면 score 테이블에는 사람의 점수 종류가 저장됩니다. 나는 score.id이 사람의 scored_id와 연결되어 설정 표에, ON DELETE: CASCADE 그래서PK와 FK 테이블 디자인의 혼동

person 
- id 
- name 
- scored_id (FK) 

score 
- id (PK) 
- bmi 
- weight 

score 테이블의 FK 제약 조건을 설정합니다. 즉, score에있는 레코드를 삭제하면 사람도 삭제됩니다. 그런데 person의 기록을 삭제하면 점수 기록이 삭제되지 않는 이유는 무엇입니까?

+0

당신은 당신이 당신의 외래 키와 순환 종속성을 이동하지 않는 한 스크립트는 다음이 일반적으로 짐승의 본성이 테이블 –

+0

을 만드는 데 사용할 포함 할 수 있습니다 - 편도 의존성 – RamRaider

+0

당신이 잘못했습니다 보인다 외계 키를 설정하십시오. @NigelRen이 말한대로 스크립트를 게시하십시오. – Kiwagi

답변

2

당신은 테이블을 구성하고, 사람이 테이블에서 사용자가 삭제 될 때/경우 점수 테이블에서 레코드를 삭제하는 외래 키를 사용하는 방법 그냥 생각. score 테이블에는 외래 키 의존성으로 사용되는 사용자에 대한 참조 (pid)가 있어야합니다. 점수가 사용자에 따라 다르므로 사용자가 없으며 점수가 없습니다.

create table `person` (
    `id` int(10) unsigned not null auto_increment, 
    `name` varchar(50) null default null, 
    primary key (`id`) 
) 
collate='latin1_swedish_ci' 
engine=innodb 
auto_increment=4; 


mysql> describe person; 
+-------+------------------+------+-----+---------+----------------+ 
| Field | Type    | Null | Key | Default | Extra   | 
+-------+------------------+------+-----+---------+----------------+ 
| id | int(10) unsigned | NO | PRI | NULL | auto_increment | 
| name | varchar(50)  | YES |  | NULL |    | 
+-------+------------------+------+-----+---------+----------------+ 




create table `score` (
    `id` int(10) unsigned not null auto_increment, 
    `bmi` int(10) unsigned not null default '0', 
    `weight` int(10) unsigned not null default '0', 
    `pid` int(10) unsigned not null default '0', 
    primary key (`id`), 
    index `pid` (`pid`), 
    constraint `fk_sc_pid` foreign key (`pid`) references `person` (`id`) on update cascade on delete cascade 
) 
collate='latin1_swedish_ci' 
engine=innodb 
auto_increment=4; 



mysql> describe score; 
+--------+------------------+------+-----+---------+----------------+ 
| Field | Type    | Null | Key | Default | Extra   | 
+--------+------------------+------+-----+---------+----------------+ 
| id  | int(10) unsigned | NO | PRI | NULL | auto_increment | 
| bmi | int(10) unsigned | NO |  | 0  |    | 
| weight | int(10) unsigned | NO |  | 0  |    | 
| pid | int(10) unsigned | NO | MUL | 0  |    | 
+--------+------------------+------+-----+---------+----------------+ 





mysql> select * from person; 
+----+------+ 
| id | name | 
+----+------+ 
| 1 | bob | 
| 2 | rita | 
| 3 | sue | 
+----+------+ 


mysql> select * from score; 
+----+-----+--------+-----+ 
| id | bmi | weight | pid | 
+----+-----+--------+-----+ 
| 1 | 34 |  34 | 1 | 
| 2 | 56 |  41 | 2 | 
| 3 | 56 |  77 | 3 | 
+----+-----+--------+-----+ 



mysql> delete from person where id=3; 
Query OK, 1 row affected (0.00 sec) 

/* delete a user, the score disappears too which makes sense */ 

mysql> select * from score; 
+----+-----+--------+-----+ 
| id | bmi | weight | pid | 
+----+-----+--------+-----+ 
| 1 | 34 |  34 | 1 | 
| 2 | 56 |  41 | 2 | 
+----+-----+--------+-----+ 
+0

예, 제 구조가 처음부터 틀리다 –

+1

일반적으로 데이터베이스 디자인은 처음 시도 할 때 거의 자리를 잡지 않습니다. 약간의 수정은 여기 저기에 어떤 일이 일어나고 어떻게되는지에 대한 명확한 아이디어를 얻는 것입니다. 위 등 다른 희망/조언이 조금 도움이되기를 바랍니다. – RamRaider

+0

플러스 10. @Madeline Ries는 내 대답을 살펴볼 가치가 있습니다. RamRaiders가 서술 설명을 도움으로 도움이된다고 생각합니다. 귀하의 신청서와 함께 Goodluck. – BusinessPlanQuickBuilder

0

"person"테이블에 "score"테이블의 참조 (FK)가 있으므로 "score"테이블의 레코드를 삭제할 때 "users"테이블의 mysql 검색 관련 레코드를 삭제하십시오.

하지만 "점수"표에는 "사람"표의 참조 (FK)가 없습니다.

당신이 사람의 기록이 삭제되지만 점수를 기록 당신의 문제는의 의미 이해입니다

person 
- id (PK) 
- name 

score 
- id (PK) 
- person_id (FK) 
- bmi 
- weight 
1

삭제 될 경우 사람의 기록은 여전히 ​​안전 할 때 점수 기록을 삭제하려는 경우 테이블 구조 아래에 시도 할 수 있습니다 작업이 아니라 구문. 직관적으로 당신의 관계는 틀리게 보인다. 특정 점수 인 75kg과 bmi 20이 동일한 점수를 가진 사람들과 많은 관계를 맺을 필요는 없습니다. 이것은 임의적 일 것입니다. 시간이 지남에 따라 점수가 달라지기를 원할 가능성이 높습니다. 그러면 사람을 삭제할 때 연관된 값이 삭제되기를 원할 것입니다. 테이블 관계는 다음과 같아야합니다 :

person 
- id (Primary Key) 
- name 

score 
- id (Primary Key) 
- bmi 
- weight 
- scoreDate 
- personID (Foreign Key to person) 

점수 날짜가 도움이 될 것입니다.

이 구조는 한 사람이 많은 점수의 기록을 가지며 시간이 지남에 따라 체중과 몸무게 지수의 변동을 볼 수있게합니다. 의미 론적으로 도움이되는 작업으로 현실과 공존하며 따라서 실세계 적용 후 엔티티 분석 및 테이블 구조 개념을 따릅니다.

Helpful discussion of ERD and table structure levels and relations