假设我有一个商店网站,用户可以在其中留下有关任何产品的评论。
假设我的网站数据库中有表(实体):让它成为'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
这是实现所需功能的数据库的有效方法吗? 还有什么方法可以做到这一点?>
答案 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和阅读其余部分)
就个人而言,我经常最终为层次结构中的所有实体(在我们的案例中使用鞋子,帽子和冰鞋)使用单个表格,并牺牲对性能和简单性的祭坛的限制(例如:在必填字段中不为空)用于鞋子,但不用于帽子和冰鞋)。