首页 > 解决方案 > 数据库设计中的常见做法?

问题描述

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

  1. 假设一个可以有一个电子邮件地址,但可以有多个tel-number,(即与email 1:1 关系,与tel 1:n 关系)。我应该在person表中包含email属性并为tel制作一个额外的表吗?由于只有 tel-nr 存储在单独的表中,以下模式是否会被视为“不干净”?

    ╔════════╗   ╔══════════╗  
    ║ person ║   ║ pers_tel ║
    ╠════════╣   ╠══════════╣
    ║ pid    ║   ║ pid      ║
    ║ ...    ║   ║ tel      ║ 
    ║ email  ║   ╚══════════╝ 
    ╚════════╝   
    
  2. 如果是这样,我只需要pidpers_tel表(FK 引用person.pid)中声明为 PK 还是应该tel是 PK?

标签: databasedatabase-designrelational-database

解决方案


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

表: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 |
+-----+-----+

数据库关系

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

在创建表之前,请看一下数据库规范化。尤其是第 1 (1NF)、第 2 (2NF) 和第 3 (3NF) 归一化形式。


推荐阅读