因为我有4种不同的产品类型(书籍,杂志,礼品,食品),我不能把所有产品都放在一个产品中#34;没有一堆空值的表。所以我决定将每个产品分解成自己的表格,但我知道这是错误的(https://c1.staticflickr.com/1/742/23126857873_438655b10f_b.jpg)。
我也尝试为此创建一个EAV模型(https://c2.staticflickr.com/6/5734/23479108770_8ae693053a_b.jpg),但我不知道如何不确定如何链接发布者和作者表。
我知道这个问题已被提出很多,但我不理解我所看到的任何答案。我认为这是因为我是一个非常直观的学习者,这使得在没有提供大量信息的情况下很难理解所讨论的内容。
答案 0 :(得分:2)
您的模型在正确的轨道上,除了产品名称应该足够您不需要礼品名称,书名等。您在这些表格中添加的信息是特定于产品类型的信息。其他产品不需要。 Product表包含所有常用字段。我会在子表中使用productid,而不是将它重命名为giftID,magazineID等。当你在命名它们时,更容易记住什么是细胞。
现在实际上,您可以尽可能多地将其放入产品表中,尤其是在您要进行计算时。我更喜欢在这种特定情况下的子表具有主要显示信息。因此,产品包含产品名称,成本,产品类型,产品销售单位等。通常需要的东西来计算订单成本或报告订购的内容。可能有一个或两个字段可以包含空值,但它简化了计算类型查询,因此它可能是值得的。
描述性细节的内容虽然会在子表中显示产品类型。这些通常仅在购物区域中显示产品时引用,并且一次只能引用一个,因此您可以使用产品类型仅允许您加入显示所需的一个子表。因此,虽然订单关心产品编号和名称和成本计算,但它可能不需要逐行描述书籍ISBN号或相机中的百万像素。但产品的描述页面确实需要这些东西。
这种方法不仅仅是纯粹的关系,尽管它主要是,但它根据数据的含义以及如何使用它们来对信息进行分组,这将使数据库更易于理解和查询。我是关系表的忠实粉丝,因为数据库只有在达到至少第三范式时才能更好地工作,但有时你可能会因为实用性而走得太远,所以数据的含义以及你分组使用数据的方式(和不仅仅是用户界面,还有以后的报告)几乎总是我在设计中的一个考虑因素。
答案 1 :(得分:0)
将每个产品类型分解为自己的表很好 - 让子表使用与父Product表相同的id,并为与Product
连接的子表创建视图答案 2 :(得分:0)
您的案例是类型和子类型的典型案例。这通常在ER建模中的对象建模和泛化/专业化中称为类/子类。这是一个很好理解的模式。已知有处理这种模式的技术。
访问以下标签,并阅读信息标签下的说明(显示为"了解详情")。还要查看这些标签下分组的问题。
single-table-inheritance class-table-inheritance shared-primary-key
如果您想更深入地使用这些流行语来搜索网络上的文章。
您已经发现并丢弃了自己的单表继承。其他答案指出了共享主键。类表继承涉及用于通用数据的单个表以及四个专用表。共享主键通常与类表继承一起使用。