我有这些表,并在一个查询中使用用户名和密码(登录时)我想从右表中选择数据。 示例:在用户表中有字段权限。 admin具有权限1,供应商具有权限2,而客户具有权限3。 谢谢。
+------------+--+----------+--+-----------+--+-------------+
| user | | admin | | vendor | | customer |
+------------+--+----------+--+-----------+--+-------------+
| id_user | | id_admin | | id_vendor | | id_customer |
| username | | id_user | | id_user | | id_user |
| password | | name | | name | | name |
| permission | | surname | | surname | | surname |
+------------+--+----------+--+-----------+--+-------------+
答案 0 :(得分:1)
为了跟进我的评论,没有理由(除了大量的重构时间承诺)这些4个表无法被规范化为一个表,其中包含以下所有相同的信息:
+------------+
| user |
+------------+
| id_user |
| username |
| password |
| permission |
| name |
| surname |
+------------+
此处permission
表示用户的类型(管理员,供应商或客户)。如果用户可能属于多个类别(例如,用户既是客户又是供应商),那么您可以将permission
视为(bit) flag field(或者您可以将其分解为3个单独的布尔字段is_X
)。这样做有许多下游好处可能不会立即显现出来。例如,您现在有一个id_user
外键到任何其他相关表中,而不是可能有4个不同的外键。
始终尝试记住经过时间考验的关系数据库设计规则: “规范化直到它受到伤害,然后去规范化直到它起作用” 。去规范化的动机几乎总是昂贵的查询,需要不断的JOIN或不必要的键分叉。