2012-04-21 80 views
0

假设我有一个商店网站,用户可以在其中留下有关任何产品的评论。数据库结构,多个实体的一个大实体

假设我在我的网站数据库中有表格(实体):让它成为'Shoes','Hats'和'Skates'。 我不想为每个实体创建单独的“评论”表(如'shoes_comments','hats_comments','skates_comments')。 我的想法是以某种方式将所有评论存储在一张大桌子上。要做到这一点

的一种方式,我认为,就是要创建一个表:

table (comments): 
ID (int, Primary Key), 
comment (text), 
Product_id (int), 
isSkates (boolean), 
isShoes (boolean), 
isHats (boolean) 

和类似标志,可能有意见的每个实体。

然后,当我想要得到一些产品SELECT查询看起来像评论:

SELECT comment 
FROM comments, ___SOMETABLE___ 
WHERE ____SOMEFLAG____ = TRUE 
    AND ___SOMETABLE___.ID = comments.Product_id 

这是为了实现对所需功能的数据库的有效途径? 还有什么其他的方法可以做到这一点?>

回答

1

我建议你为评论制作一张表,并在评论表中使用其他表的外键。

+0

我的想法有些不同。正如我理解你的想法:为每个实体表添加一个外键到全局注释表。 – 2012-04-21 20:51:40

1

对不起,这感觉很奇怪。

对于每种产品类型您是否确实有一个单独的表格?他们没有共同的领域(例如名称,描述,价格,产品形象等)?

我建议,作为表:product共同领域,comments与外键product但没有hasX列,hat只有特定于帽子生产线等领域。 hat中的主键是product PK或单个唯一值(那么您需要额外的字段用于product的外键)。

+0

好吧,我猜想一种类型的产品,这不是一个困难的。但在我的情况下,我有完全独立的东西(假设:组织,员工,技术设备)的实体,我需要为他们存储评论... – 2012-04-21 21:06:36

+0

好吧,我被你的例子误导了,对不起。尽管如此,你只需要一个“评论”表 - 如果你愿意稍微弯曲这些规则。你不希望在每个有我有评论的实体的'comment'中有一个外键列。如果您没有实际的外键列,但是在'comment'中声明为'parent_id'的一列?我想从'X'到'comment'的关系可以是单向的?一种替代方法是为每个'X'给''comment'加入一个连接表,例如'shoe_x_comment','hat_x_comment'。 – 2012-04-21 21:20:47

0

的“归一化”的方式来做到这一点是要增加一个实体(比如,“产品”)的团体共同鞋子,帽子和溜冰鞋(包括评论)

   +-- 0..1 [Shoe] 
       | 
[Product] 1 --+-- 0..1 [Hat] 
    1   | 
    |   +-- 0..1 [Skate] 
    * 
[Comment] 

除了性能方面的考虑所有特性这里的缺点是数据模型中没有任何内容阻止Product中的行被Shoe中的行和Hat中的行所引用。你也许想要读一些关于“jpa继承策略”的东西 - 你会发现讨论同样问题的java专用文章(只是忽略了java的bab and声和阅读其余部分)

就个人而言,我经常最终使用一张表来表示层次结构中的所有实体(在我们的例子中为鞋子,帽子和溜冰鞋)并牺牲了对性能和简单性的限制(例如:not null in一个对鞋子而言是强制性的领域,但不适用于帽子和溜冰鞋)。

+0

在我将创建表“COMMENTABLE”并从实体表(帽子,鞋子,溜冰鞋)将它们以1:1关系连接到它的情况下,这样做会工作吗? – 2012-04-21 21:18:07

+0

是的 - 这就是主意!在开始之前,你会想要考虑演出......例如:添加一个新的鞋子,你需要两个插入语句(1个用于Commentable和1个用于鞋子) - 如果你有注释的id并且你想要导航到它的所有者实体,你需要(可能是几个)联合条款,因为你事先不知道该实体在哪个表中(可能是鞋,帽子或滑板)...... – giorgiga 2012-04-21 21:30:21

+0

这里的麻烦实在是E/R不会继承 - 可以模拟它(例如在3个JPA策略中),但他必须接受一些权衡 – giorgiga 2012-04-21 21:32:17

相关问题