2010-02-18 18 views
2

我是相對較新的SQL,我不知道如何做一對一的關係。在瞭解了前三種標準化形式之後,我目前認爲最好的辦法是建立一箇中間表,ala-3rd來自多種關係,除了每一列被聲明爲唯一的。我應該如何在(My)SQL中實現一對一的關係?

+2

一對一關係是指a)應該只有一個表或b)關係需要重新分類,因此它是一對多或多對多關係。 – 2010-02-18 04:32:44

+0

@OMG小馬我並不完全同意這一點。您可以擁有另一個具有一對一關係的表格。這並不總是有意義,但我相信有人可以想到它的原因 – 2010-02-18 04:34:48

+0

@ do3boy:數據庫還允許您創建不通過1NF的表。只因爲你可以,並不意味着你應該。 – 2010-02-18 04:39:06

回答

6
ImageDetails 
------------ 
id (PK) 
name 
description 


ImageData 
------------ 
id (PK & FK) 
blobfield 

像這樣的東西可能是一個很好的理由/辦法做一個一對一的關係,但通常你只會在一個表中的所有數據,其中每一行是什麼定義的關係。

將它們分開的一個原因可能是限制用戶訪問特定表,同時允許訪問該關鍵字段的其他數據。

如果您不希望在列中擁有null,那麼爲單一關係設置單獨的表的另一個可能原因是您不希望列中有null。例如,如果90%的數據爲空,那麼最好使用一個完全獨立的(和更小的)表,然後加入PK上的該字段。這實際上被認爲是「可選的一對一關係」,因爲對於每一種可能的關係你都沒有真正的記錄。

2

對於一對一關係,您不需要第三張表,但如果關係是多對多關係,那麼您確實需要它們之間的第三個中間表。

0

可選的一對一關係出現在現實世界中。實現它們的最簡單的方法,恕我直言,是與一個獨特的外鍵。

mysql> describe table_one; 
+--------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+--------------+--------------+------+-----+---------+----------------+ 
| id   | int(11)  | NO | PRI | NULL | auto_increment | 
| table_two_id | int(11)  | YES | UNI | NULL |    | 
+--------------+--------------+------+-----+---------+----------------+ 
0 rows in set (0.00 sec) 

mysql> describe table_two; 
+--------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+--------------+--------------+------+-----+---------+----------------+ 
| id   | int(11)  | NO | PRI | NULL | auto_increment | 
+--------------+--------------+------+-----+---------+----------------+ 
0 rows in set (0.00 sec) 
相關問題