我目前正在开发联系人管理数据库,我遇到了以下问题:
让我们说一个人可以有一个电子邮件地址但是多个电话号码,(即1个:1与电子邮件的关系以及与电话的1:n关系。我应该在人表中添加电子邮件属性,并为 tel 制作一个额外的表吗?是否会考虑以下架构"不干净"因为只有tel-nr存储在一个单独的表中?
╔════════╗ ╔══════════╗
║ person ║ ║ pers_tel ║
╠════════╣ ╠══════════╣
║ pid ║ ║ pid ║
║ ... ║ ║ tel ║
║ email ║ ╚══════════╝
╚════════╝
如果是这样,我是否只需将pid
表中的pers_tel
(FK引用person.pid
)声明为PK,或者tel
也应该是PK
答案 0 :(得分:0)
在我看来,最好将数据存储在一个单独的表中(在您的情况下)。这样您就可以轻松地操作数据。
表:person
PK:PID
+-----+-----+------------------+
| PID | --- | email |
+-----+-----+------------------+
| 01 | --- | john@email.com |
| 02 | --- | Bishoy@email.com |
| 03 | --- | Atul@email.com |
+-----+-----+------------------+
表:pers_tel
PK:PID
和Tel
+-----+-----+
| PID | Tel |
+-----+-----+
| 01 | 123 |
| 01 | 426 |
| 01 | 752 |
| 02 | 456 |
| 03 | 789 |
+-----+-----+
如果某人也可以拥有多个电子邮件地址,那么您也可以为此创建一个表格。
在创建表之前,请先查看数据库规范化。特别是第1(1NF),第2(2NF)和第3(3NF)归一化形式。
答案 1 :(得分:0)
您的设计是"清洁" - 或者更正式地,非规范化。实体的奇异属性(如电子邮件地址)存储为列;多个属性(如电话号码)使用一对多关系存储在相关表中。该关系的标识符是主键。
PID不能是pers_tel表中的主键,因为可能存在多个相同值的实例。相反,您可以决定不为该表声明主键,或者创建一个人工键。
如果有另一个鉴别器(例如"电话类型"),您可以将其作为主键的一部分包含PID,只要业务域说明"一个人可能有多个电话,每个手机都有一个唯一的类型标识符(例如"家庭","手机"等)。
将PID和TEL组合到一个主键中并不是一种常见的设计解决方案 - " person"的属性值。 table不适合主键。