database - 数据库设计中的常见做法?
问题描述
我目前正在开发一个联系人管理数据库,我遇到了以下问题:
假设一个人可以有一个电子邮件地址,但可以有多个tel-number,(即与email 1:1 关系,与tel 1:n 关系)。我应该在person表中包含email属性并为tel制作一个额外的表吗?由于只有 tel-nr 存储在单独的表中,以下模式是否会被视为“不干净”?
╔════════╗ ╔══════════╗ ║ person ║ ║ pers_tel ║ ╠════════╣ ╠══════════╣ ║ pid ║ ║ pid ║ ║ ... ║ ║ tel ║ ║ email ║ ╚══════════╝ ╚════════╝
如果是这样,我只需要
pid
在pers_tel
表(FK 引用person.pid
)中声明为 PK 还是应该tel
是 PK?
解决方案
在我看来,最好将数据存储在一个单独的表中(在你的情况下)。这样您就可以轻松地操作数据。
表: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) 归一化形式。
- https://www.tutorialspoint.com/dbms/database_normalization.htm
- https://www.lifewire.com/database-normalization-basics-1019735
- https://www.essentialsql.com/get-ready-to-learn-sql-database-normalization-explained-in-simple-english/
- https://www.studytonight.com/dbms/database-normalization.php
- https://medium.com/omarelgabrys-blog/database-normalization-part-7-ef7225150c7f
推荐阅读
- go - 如何对 golang sdk 方法进行性能测试?
- node.js - 如何在 Node/Browser 模块中选择使用“window”变量?
- java - 如何检查字符串的开头是否包含数字?
- android - AccessibilityEvent中获取窗口android的详细文本
- javascript - 从数组中随机删除元素直到为空
- javascript - Vue.js Computed/Watch 对视口宽度数据更改没有反应
- python - 了解 find_elements_by_xpath 在 Selenium 中返回的内容
- sql - 有没有办法在“分组”国家之后只显示查询的前 2/n 个?- 大查询 SQL
- html - 如何通过用户资产 ID 访问元素?
- javascript - 一次将 JSON 重复对象发布到服务器而不需要复制?