数据库设计的常见做法?

时间:2018-05-14 07:48:22

标签: database database-design relational-database

我目前正在开发联系人管理数据库,我遇到了以下问题:

  1. 让我们说一个可以有一个电子邮件地址但是多个电话号码,(即1个:1与电子邮件的关系以及与电话的1:n关系。我应该在表中添加电子邮件属性,并为 tel 制作一个额外的表吗?是否会考虑以下架构"不干净"因为只有tel-nr存储在一个单独的表中?

    ╔════════╗   ╔══════════╗  
    ║ person ║   ║ pers_tel ║
    ╠════════╣   ╠══════════╣
    ║ pid    ║   ║ pid      ║
    ║ ...    ║   ║ tel      ║ 
    ║ email  ║   ╚══════════╝ 
    ╚════════╝   
    
  2. 如果是这样,我是否只需将pid表中的pers_tel(FK引用person.pid)声明为PK,或者tel也应该是PK

2 个答案:

答案 0 :(得分:0)

在我看来,最好将数据存储在一个单独的表中(在您的情况下)。这样您就可以轻松地操作数据。

表:person
PK:PID

+-----+-----+------------------+
| PID | --- |      email       |
+-----+-----+------------------+
|  01 | --- | john@email.com   |
|  02 | --- | Bishoy@email.com |
|  03 | --- | Atul@email.com   |
+-----+-----+------------------+

表:pers_tel
PK:PIDTel

+-----+-----+
| PID | Tel |
+-----+-----+
|  01 | 123 |
|  01 | 426 |
|  01 | 752 |
|  02 | 456 |
|  03 | 789 |
+-----+-----+

Database Relationship

如果某人也可以拥有多个电子邮件地址,那么您也可以为此创建一个表格。

在创建表之前,请先查看数据库规范化。特别是第1(1NF),第2(2NF)和第3(3NF)归一化形式。

答案 1 :(得分:0)

您的设计是"清洁" - 或者更正式地,非规范化。实体的奇异属性(如电子邮件地址)存储为列;多个属性(如电话号码)使用一对多关系存储在相关表中。该关系的标识符是主键。

PID不能是pers_tel表中的主键,因为可能存在多个相同值的实例。相反,您可以决定不为该表声明主键,或者创建一个人工键。

如果有另一个鉴别器(例如"电话类型"),您可以将其作为主键的一部分包含PID,只要业务域说明"一个人可能有多个电话,每个手机都有一个唯一的类型标识符(例如"家庭","手机"等)。

将PID和TEL组合到一个主键中并不是一种常见的设计解决方案 - " person"的属性值。 table不适合主键。