数据库结构,多个实体的一个大实体

时间:2012-04-21 20:38:16

标签: sql database architecture structure

假设我有一个商店网站,用户可以在其中留下有关任何产品的评论。

假设我的网站数据库中有表(实体):让它成为'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

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

3 个答案:

答案 0 :(得分:1)

我建议你为注释创建一个表,并在注释表中使用其他表的外键。

答案 1 :(得分:1)

对不起,这感觉很奇怪。

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

我对表格的建议:product表示常用字段,comments表示外键为product但没有hasX列,hat只有字段这是帽子产品系列特有的。 hat中的主键是product PK或单个唯一值(那么您需要为product的外键添加额外字段。)

答案 2 :(得分:0)

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

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

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

还有其他选择(每个都有特权和缺陷) - 您可能想要阅读有关“jpa继承策略”的内容 - 您将找到讨论同一问题的特定于Java的文章(只是忽略了java babbling和阅读其余部分)

就个人而言,我经常最终为层次结构中的所有实体(在我们的案例中使用鞋子,帽子和冰鞋)使用单个表格,并牺牲对性能和简单性的祭坛的限制(例如:在必填字段中不为空)用于鞋子,但不用于帽子和冰鞋)。