2017-12-30 47 views
0

私はpersonテーブルとscoreテーブルを持っています。 Personテーブルには基本的に人の情報が格納されますが、scoreテーブルには人がどのようなスコアを格納しています。私はscore.idは人のscored_idとリンクされている設定テーブルで、だから、ON DELETE: CASCADEPKと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

あなたのテーブルでは、「人」テーブルは「スコア」テーブルの参照(FK)を持っていますので、「スコア」テーブルのレコードを削除すると「ユーザー」テーブルの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

関連する問題