php - 用户数据库模式 - 是否过度规范化?

标签 php mysql database-design database-schema

我正在尝试创建用户的数据库架构。我可以将“用户”实体视为具有其属性的对象,如下所示:

  • 用户(表格)
    • 编号
    • 名字
    • 姓氏
    • 电子邮件
    • 密码
    • 描述(文本)
    • 类别(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/

相关文章:

php - Laravel 4 + Zurb Foundation 5 的最佳实践?

php - 如何从 Laravel MSSQL 数据库中读取亚美尼亚文本

file-upload - session 上传进度是否适用于 nginx 和 php-fpm?

php - Laravel 5 表单不工作(不插入数据)

数据库设计 : should I use a mapping table?

database-design - 具有循环特征的议程应用数据库模型

mysql - 如何为不存在的值显示零行

mysql - 将 SQL 查询转换为 PHP Activerecord

mysql - 使用 LEFT JOIN 更新 MySQL 中的多个表

database - 如何更新翻译词典数据库的翻译表