0

假设我有一个商店网站,用户可以在其中对任何产品发表评论。

假设我的网站数据库中有表格(实体):让它成为“鞋子”、“帽子”和“溜冰鞋”。我不想为每个实体创建单独的“评论”表(如“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

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

4

3 回答 3

1

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

于 2012-04-21T20:44:21.640 回答
1

对不起,这感觉很奇怪。

您是否确实为每种产品类型提供了一个单独的表格?他们没有共同的领域(例如名称、描述、价格、产品图片等)吗?

我对表格的建议:product对于公共字段,comments具有外键product但没有hasX列,hat只有特定于帽子产品线的字段。中的主键hatproductPK 或单独的唯一值(那么您需要一个额外的字段作为外键的product)。

于 2012-04-21T20:52:48.313 回答
0

执行此操作的“标准化”方法是添加一个实体(例如,“产品”),将鞋子、帽子和溜冰鞋的所有共同特征(包括评论)分组

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

除了性能考虑之外,这里的缺点是数据模型中没有任何内容阻止 Product 中的一行被 Shoe 中的一行和 Hat 中的一行引用。

还有其他替代方案(每个都有优点和缺陷)-您可能想阅读有关“jpa继承策略”的内容-您会发现讨论相同问题的java特定文章(只需忽略java babbling并阅读其余部分)

就个人而言,我经常最终对层次结构中的所有实体(在我们的例子中是鞋、帽子和溜冰鞋)使用一个表,并牺牲对性能和简单性的限制(例如:在鞋类必需的字段中不为空,但不适合帽子和溜冰鞋)。

于 2012-04-21T21:05:49.990 回答