mysql - 如何使用空外键进行高效的数据库设计?
问题描述
我想创建一个数据库,当我查询它时,它会给我用户数据、扇区和子扇区(如果用户没有子扇区,它会给我 NULL)。
每个用户都有一个扇区,每个子扇区都有一个扇区。但问题不是每个用户都有一个子扇区。
有没有比我设计的这个数据库更好更有效的方法?在用户表中,我使子扇区列可以为 NULL。
Table : user
+------------+----------+
| Column | Type |
+------------+----------+
| id_user | INT (PK) |
| name | Char |
| sector | INT(FK) |
| sub sector | INT(FK) |
+------------+----------+
Table : sector
+------------+----------+
| Column | Type |
+------------+----------+
| id_sector | INT (PK) |
| sector_name| Char |
+------------+----------+
Table : sub_sector
+----------------+----------+
| Column | Type |
+----------------+----------+
| id_sub_sector | INT (PK) |
| sub_sector_name| Char |
| id_sector | INT (FK) |
+----------------+----------+
解决方案
如果每个子扇区都有一个唯一的扇区,那么在您的架构中,当用户拥有一个子扇区时,您就有了冗余。为了消除这种冗余,您可以设计一个这样的模式,其中您有一个用于扇区和子扇区的表。
User(user_id, name, sect_id)
sect_id
表的非空外键在哪里Sect
Sect(sect_id, name, type, super_sect)
其中type
有两个不同的值,一个用于子扇区,一个用于扇区,sect_id
并且name
是扇区或子扇区的 id 和名称,并且super_sect
,仅当类型为 sub_sector 时才不为空,是表 Sect 的外键。
您还可以通过为扇区和子扇区提供一致不同的 id 来提高效率,例如奇数/偶数或不同间隔的整数。
推荐阅读
- choco - 用 choco 在一个约束中对一个变量 (X[i][j]) 求和
- node.js - ECONNRESET 与 postgres 并在 nodejs 上进行续集
- c - 如何在两个数组中找到匹配的值?
- node.js - 在 save() 之前将 null 设置为 mongo 必填字段
- java - Spring Boot 应用程序在本地的 tomcat 8 上正常启动,但我得到 404
- python - 根据已知域查找完整的 URL
- ios - 无法将类型“(_)->()”的值转换为预期的参数类型“CompletionHandler?” 使用 KingFisher Swift
- sql - 用于搜索的 Oracle BLOB
- c - 像这样将 char 连接到 char 数组是否正确?
- node.js - 如何将 OpenLayers 5 与 Node (express) 一起使用?