【问题标题】:Separate tables or pivot table (or both)单独的表或数据透视表(或两者)
【发布时间】:2013-09-23 15:50:16
【问题描述】:

我网站的用户可以上传文件。在question 的帮助下,我提出了两种用于建模文件状态的设计。

示例状态 - 已删除、待处理、禁止、上传

设计 A - 单独的表格

文件 - file_id(pk) | user_id(fk) |文件名

禁止文件 - file_id(fk) |禁止原因 |管理员用户 |时间

已删除文件 - file_id(fk) |永久删除 |时间 |删除_by

待处理文件 - file_id(fk) |开始时间 |等待


设计 B - 数据透视表和单独的信息表(两者)

文件 - file_id(pk) | user_id(fk) |文件名

状态 - status_id(pk) status_text

文件状态 - file_id(fk) | status_id(fk) | info_id(fk) 链接到另一个表中的记录,该表存储有关此状态的信息,例如(ban_reason、admin_user、time)

禁止信息 - info_id(fk) |禁止原因 |管理员用户 |时间

已删除信息 - info_id(fk) |永久删除 |时间 |删除_by

待定信息 - info_id(fk) |开始时间 |等待


我的主要关注设计a是在选择文件时,我必须加入几个表来检查它们是否被禁止等等。设计b旨在防止需要执行连接的需要需要加入一张桌子。

您会推荐哪种设计?

设计 A 的选择查询会不会太慢?

【问题讨论】:

    标签: mysql database database-design relational-database


    【解决方案1】:

    如果您担心性能问题,可以在文件表中包含一个名为 active 的 BIT 列。 1 表示它处于活动状态,0 表示不处于活动状态。这将让您找到只有一个表的所有活动文件,但维护它会有一些开销。这很适合设计 A。

    【讨论】:

    • 谢谢,我考虑过,但这似乎不是一个好主意,因为它肯定活动字段会不同步。从文件中选择 file_id 不在 4 个或 5 个其他表中的文件是否值得关注?
    • 一次只选择一个文件吗?这取决于你的负载有多重。如果你索引其他表的文件 id 并且只在一个文件 id 上进行搜索,它不会太糟糕。它实际上取决于您的表的大小。
    • 更多时候不是一次只有一个文件。
    • 这有助于加快速度。如果您只需要查看文件是否被禁止/删除/挂起,那么设计 B 会更好,因为它只是一次索引搜索。
    猜你喜欢
    • 2013-12-15
    • 1970-01-01
    • 2018-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-21
    • 1970-01-01
    • 2018-11-24
    相关资源
    最近更新 更多