用户数据库模式 - 是否过度规范化?
User database schema - over normalization or not?
我正在尝试创建用户的数据库架构。我可以将 "user" 实体视为具有其属性的对象,如下所示:
- 用户(table)
- id
- 名字
- 姓氏
- 电子邮件
- 密码
- 盐
- 说明(文字)
- 类别(tinyint - 外键)
- sub_category(tinyint - 外键)
- status (varchar, active, banned, waiting(等待批准))
- 创建(日期时间)
- 已编辑(日期时间)
- 已删除(日期时间)
否则我可以将描述分开,分为users_description table(1-1关系),类别在user_category(1-1),users_status(1- 1), users_datetime(1-1)(用于创建、编辑...)并通过连接加入它们。
哪种形式更好?我认为第二个假设是"over normalized",理论上更好但实际上没有。我使用 Mysql 和 php.
您的架构很好地列出了有时 "overnormalized"。
不要规范化 "continuous" 事物,例如 DATETIME
、数字、浮点数等。某天您可能需要获取某些日期时间范围内的行;规范化会使笨拙和低效。
诸如 "status" 和 "flags" 和 "yes/no" 之类的事情通常用简单的 ENUM
.
可以更好地处理
假设 "category"(也许 "sub-category")有一些其他相关信息,将其规范化可能没问题。如果是users和category之间的"many-to-many"关系,那么你需要多2张表,而且不是真的"normalization"而是"relationship"。 (你提到了 1-1;我怀疑那是一个错误。)
description TEXT
-- 这听起来像是一个永远不会重复的字段,因此规范化既不会保存 space 也不会简化更改它。不归一化。
我正在尝试创建用户的数据库架构。我可以将 "user" 实体视为具有其属性的对象,如下所示:
- 用户(table)
- id
- 名字
- 姓氏
- 电子邮件
- 密码
- 盐
- 说明(文字)
- 类别(tinyint - 外键)
- sub_category(tinyint - 外键)
- status (varchar, active, banned, waiting(等待批准))
- 创建(日期时间)
- 已编辑(日期时间)
- 已删除(日期时间)
否则我可以将描述分开,分为users_description table(1-1关系),类别在user_category(1-1),users_status(1- 1), users_datetime(1-1)(用于创建、编辑...)并通过连接加入它们。
哪种形式更好?我认为第二个假设是"over normalized",理论上更好但实际上没有。我使用 Mysql 和 php.
您的架构很好地列出了有时 "overnormalized"。
不要规范化 "continuous" 事物,例如 DATETIME
、数字、浮点数等。某天您可能需要获取某些日期时间范围内的行;规范化会使笨拙和低效。
诸如 "status" 和 "flags" 和 "yes/no" 之类的事情通常用简单的 ENUM
.
假设 "category"(也许 "sub-category")有一些其他相关信息,将其规范化可能没问题。如果是users和category之间的"many-to-many"关系,那么你需要多2张表,而且不是真的"normalization"而是"relationship"。 (你提到了 1-1;我怀疑那是一个错误。)
description TEXT
-- 这听起来像是一个永远不会重复的字段,因此规范化既不会保存 space 也不会简化更改它。不归一化。