我正在尝试创建用户的数据库架构。我可以将“用户”实体视为具有其属性的对象,如下所示:
- 用户(表格)
- 编号
- 名字
- 姓氏
- 电子邮件
- 密码
- 盐
- 描述(文本)
- 类别(tinyint - 外键)
- sub_category(tinyint - 外键)
- 状态(varchar、active、banned、waiting(等待批准))
- 创建(日期时间)
- 编辑(日期时间)
- 已删除(日期时间)
否则我可以将描述分成 users_description 表(1-1 关系),user_category(1-1)中的类别,users_status(1-1),users_datetime(1-1)(用于创建,编辑...)并加入他们。
哪种形式更好?我认为第二个假设是“过度标准化”,理论上更好但实际上没有。我使用 Mysql 和 php。
最佳答案
您的模式是一个很好的列表,列出了有时会“过度规范化”的事物。
不要规范化“连续”的东西,例如 DATETIME
、数字、 float 等。某天您可能需要获取某个日期时间范围内的行;规范化会使这变得笨拙且效率低下。
诸如“状态”和“标志”和“是/否”之类的事情通常用简单的 ENUM
可以更好地处理。
假设“类别”(可能还有“子类别”)有一些其他相关信息,将其规范化可能没问题。如果是用户和类别之间的“多对多”关系,那么你需要额外的2个表,它不是真正的“规范化”而是“关系”。 (你提到了 1-1;我怀疑这是一个错误。)
description TEXT
-- 这听起来像是一个永远不会重复的字段,因此规范化既不会节省空间也不会简化更改。不要规范化。
关于php - 用户数据库模式 - 是否过度规范化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34252905/