具有不同类型页面和特殊要求的站点范围的注释

时间:2011-10-08 21:40:02

标签: sql database architecture

我有兴趣为具有以下要求的网站设计数据库(好吧,我只关心一个表):

  1. 有一个items页面,其中列出了项目。 items.xyz?id=t显示ID为t的项目。我需要项目的ID是连续的。第一项有ID 1,第二项有ID 2,依此类推。每个项目页面都有关于该项目的评论。
  2. 还有其他页面,例如objects,其中objects.xyz?id=t显示ID为t的对象。这里的ID不一定是连续的(并且它们可以与项目ID重叠,但如果您建议强制它们不重叠的东西就可以了)。这些也有意见。
  3. 我的问题是如何设计Comments表?如果我在其中有EntityID表示应该显示注释的页面(无论是项目页面还是对象页面),那么我应该这样做,以便ItemID永远不会重叠{ {1}}让所有ObjectID从10 9 开始并使用GUID表? (ItemID增长非常缓慢)。这是可接受的做法吗?

    现在我通过在每条评论中添加一堆可以为空的布尔字段来实现:ObjectIDIsItemIsObjectType1,...,这让我知道在哪里应显示每条评论。这并不是那么糟糕,因为我只有一些对象,但它看起来像是一个丑陋的黑客。

    最好的方法是什么?

1 个答案:

答案 0 :(得分:1)

我看到三种解决方案(假设将页面和对象放在一个表中是不可能或不希望的)。之一:

  1. 通过给它两列来说明它所属的评论:PageId和ObjectId。 这样,您还可以将这些列的外键提供给相应的表并添加适当的索引。

  2. 引入一个具有唯一ID,PageId和ObjectId的表'Entity'。当然,任何一列都是可选的,其中一列必须填充,而不是0或两者。 这样,您将具有单独实体的所有潜在垃圾移动到此表,而不是污染评论表,该表应仅包含注释。你把这个烂摊子隔离开来。

  3. 在Comments和Items之间创建一个链接表,在Comments和Objects之间创建另一个表。项目和对象完全不相关,您不必在多列中使用大量NULL值污染“注释”表。创建注释时,通过在ItemComments或ObjectComments中插入链接来决定它是否链接到项目或对象。读取项目或对象的注释只需要两个简单的连接。

  4. 注释表只能包含一个引用实体表中Id的EntityId。

    这种方法的最大优点是双重的:
    a)你也可以将其他东西链接到同一张桌子上,这很烦人 b)您可以添加其他类型的实体,它们会自动支持您可能添加的评论和其他内容,如a)中所述。