2009-02-18 38 views
1

假设您有以下表格:RestaurantChainsRestaurants,MenuItems - 它们之间有明显的关系。现在,您有CommentsRatings的表格,其中存储有关链条,餐馆和菜单项的顾客评论/评级。链接这些表格的最佳方式是什么?最明显的解决方案可能是:所有者ID类型数据库字段

  • 使用列OwnerType和表CommentsRatingsOwnerID,但现在我不能添加外键的意见/评级与他们对精神疾病
  • 创建单独的对象链接每个表的CommentsRatings的表格,例如MenuItemRatings, MenuItemComments等。这种解决方案的优点是所有正确的外键都存在,并且具有显着的缺点,即具有基本上相同结构的大量和大量表。

那么,哪种解决方案效果更好?还是有更好的解决方案,我不知道?

回答

4

由于有关的菜单项意见是从大约一间餐厅(即使他们碰巧共享相同的结构)的意见不同,我会把他们分开表并具有适当的FK来强化数据库中的某些数据完整性。

我不知道为什么有人厌恶你的数据库中有更多的表。除非你从50个表格到5万个表格,否则由于大型目录表格的存在,你不会看到性能问题(并且在这种情况下具有更多,更小的表格实际上应该会给你更好的性能)。我也倾向于认为,处理名为“Menu_Item_Comments”和“Restaurant_Comments”的表比处理称为“评论”的表更清楚,并且不知道仅仅通过其中的确切内容它的名字。

0

对所有对象都有一个评论/评级表,并且不使用自动生成的外键。评级表中的关键字,例如RatingID可以放在餐厅,连锁店,菜单项表中的一个字段中,并且它们都可以指向同一个表,它们仍然是外键。

如果您需要反过来知道审核与您相关的对象,则需要有一个字段来指定审核类型,但这应该是全部。

+0

等一下,要么我没有收到什么东西,要么你的解决方案将允许一个项目有一个评级/评论。我想要一个Restaurant/MenuItem/etc有很多评论,所以我不能在Restaurant/MenuItem/etc中添加一个RatingID列。 – 2009-02-18 18:05:15

+0

我的错误。我认为Decker有你正在寻找的解决方案。 – 2009-02-18 21:16:00

0

使用单个表格进行评论,并使用GUID作为贵宾的主键。

然后你就可以,甚至没有事先知道选择的意见,他们属于:

SELECT CommentText 
FROM Comments c, Restaurants r 
WHERE c.Source = r.Id 

SELECT CommentText 
FROM Comments c, Chains ch 
WHERE c.Source = ch.Id 

不能使用征求意见外键,当然,但它不是,注释不能没有外键的生活。

您可以清除触发器中的孤立注释,但如果其中一些留下,则没有什么不好。

您艾米还可以创建一个全球Entity表(使用单一GUID列),让你的ChainsRestaurantsMenuItemsComments指的是表与FOREING KEY ON DELETE CASCADE,当DELETE“荷兰国际集团,也就是说,一个餐厅,将其删除从该表中取而代之。它会删除一个餐厅和所有的评论,你仍然有你的诚信。

0

如果要利用外键约束并规范化基表中的评论(和评分)属性,则可能需要在基表与评论(和评分)之间创建关系表。

例如对于餐厅和评论:

Restaurants 
    id (PK) 
    (attributes of restaurants...) 

RestaurantComments 
    id (PK) 
    restaurantid (FK to Restaurants) 
    commentid (FK to Comments) 

Comments 
    id (PK) 
    (attributes of comments...)