我应该如何在(My)SQL中实现一对一的关系?

时间:2010-02-18 04:29:09

标签: sql

我对SQL比较陌生,我不确定如何建立一对一的关系。在阅读了前3种规范化形式之后,我目前的印象是,最好的方法是拥有一个中间表,ala-3rd来自多对多关系,除了每列被声明为唯一。

3 个答案:

答案 0 :(得分:6)

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


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

这样的事情可能是建立一对一关系的一个很好的理由/方式,但通常你只需要在一个表中拥有所有数据,其中每一行都是定义关系的。

将它们分开的一个原因可能是限制用户访问特定表,同时允许访问该键字段的其他数据。

为一对一关系建立单独表格的另一个可能原因是,您不希望在列中添加null。例如,如果90%的数据为空,那么使用完全独立(和较小)的表并在PK上加入该字段可能会更好。这实际上被认为是一种“可选的一对一关系”,因为你并没有为每一种可能的关系创造一条记录。

答案 1 :(得分:2)

您不需要第三个表来实现一对一关系,但如果关系是多对多关系,那么您需要在它们之间使用第三个中间表。

答案 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)