【问题标题】:Database Design for "common concepts"“通用概念”的数据库设计
【发布时间】:2012-01-06 23:14:33
【问题描述】:

在我正在开发的项目中,我有几个“通用对象”,它们跨越并关联了其他几个表。

例如,考虑对象“评论”。它应该适用于多种不同的对象:一张照片、一个动作、一个事件……并且它始终具有相同的结构(作者、文本、插入时间……)

我采用的第一个解决方案是为每种评论创建单独的表格:PhotoComments、EventComments 并将它们与相关对象关联起来,并与(例如)photo_id 列建立一对多关系。

第二个(也是当前一个)包含一个单独的 Comments 表(每个都有自己的 id),并有尽可能多的“多对一”支持表来将这些 cmets 与(即)他们的照片相关联。

这样的设计有什么缺点吗?

【问题讨论】:

  • 您的问题是针对您的哪个设计?

标签: sql database-design relational-database database-schema


【解决方案1】:

如果您加载评论所属的数据,然后查找分配给它的 cmets,则单个 cmets 和一对多的效果很好。

但是,如果您想找到评论所属的实体,那么一对多的表就会变得很痛苦,因为您必须查看所有链接表才能找到评论所属的内容。当然,您可以在 cmets 表中添加另一列以指示它属于哪种实体类型,然后您就知道要转到哪个链接表。从事物的声音来看,您的 cmets 不属于多个实体,这消除了这种复杂性。

我会使用单个 cmets 表(可能会将作者移动到自己的表中,这样您就可以轻松查看哪些 cmets 属于一个作者,而无需在每条记录中复制作者信息)

【讨论】:

  • 因为这将是产品的演示,我想我会坚持已经实现的“公用表”设计。
【解决方案2】:

我能想到的一个缺点是表锁定。

假设有一个照片评论查询。根据您的设置,表格可能会锁定以检索此照片评论。然后说另一个查询来进行操作评论。如果表格因照片评论而被锁定,则此新查询必须等待它完成。

根据表的大小以及对其中数据进行查询的频率,此表可能会成为架构中的性能瓶颈。如果您认为这不会成为问题,那么做一个表会更容易维护。但是,如果对 cme​​ts 有很多争用,那么拆分表会有所帮助。

【讨论】:

    猜你喜欢
    • 2010-09-24
    • 2015-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-07
    • 2013-09-24
    • 2013-12-16
    • 1970-01-01
    相关资源
    最近更新 更多