ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

mysql – 在三个表之间创建关系

2019-07-09 04:13:59  阅读:139  来源: 互联网

标签:mysql database sql database-design theory


我可以想到很多方法来共同解决这个问题,但我想知道最佳做法是什么:

我有三张桌子.产品,价格表和价格.

一种产品可以属于许多价格表.

一个价格表可以属于许多产品.

这是一个多对多的关系,据我所知,需要一个Junction表(pricelist_products).哪个效果很好.

现在,价格表中的一种产品可以有多种价格.只有在价格表中,产品才会被定价.

我在这里想到的是使用联结表’pricelist_products’中的ID作为价格表中的外键,但这感觉真的……哈哈?

可疑的例子:

产品1 – 钓鱼竿.

价目表A – 渔民.

价格表B – Fishingshop.

价格表1,产品1,价格1:
(每月还款选项1(无存款))

价格表A,产品1,价格2:
(每月还款选项2(有押金))

价格表A,产品1,价格3:
(四分之一还款)

价格表1,产品1,价格1:
(四分之一还款)

解决方法:

What I’ve thought about here is using the ID from the junction table ‘pricelist_products’ as a foreign key within the prices table, but this feels really…. hacky?

也许这里的问题只是一个观点.联结表的目的是在多对多关系中唯一定义每个组合(最初:pricelist到product).这可以在具有字段product_id和pricelist_id的联结表中实现,并且没有代理键id.

当然,如果您使用PRIMARY KEY(product_id,pricelist_id)定义了联结表,则此表将无法在考虑价格时唯一定义组合.因此,您将第三个ID添加到联结表.在定义仅两个表之间的关系时,您似乎将此字段视为必要的代理键.但是,由于此字段的实际效用与第三个表相关,因此您可以将其命名为price_id,将联结表命名为pricelist_product_price,并在所有三个字段上定义主键(例如).这更清楚地说明了每个领域的目的,因此在实践中可能不会感到“hacky”.

我不知道这是否是数据库设计的最佳实践,但请记住,没有理由必须完全规范化每个数据库.您需要具有合理数量的灵活性和可扩展性的良好性能(这对于休闲博客来说意味着一件事,对于小型企业来说则是另一回事),并且通常可以通过某种程度的非规范化设计来实现.

编辑补充说:好的,还有一个我忘了提及的改变将属于“好”的设计或最佳实践.在您的图片中,价格表中有两个ID字段,其中一个就足够了.正如@Gilbert Le Blanc指出的那样,你应该尽量避免模糊的字段名称,比如有多个id字段,即使它们在不同的表中.这将帮助您查看字段的实用程序,识别自然键并消除冗余.

标签:mysql,database,sql,database-design,theory
来源: https://codeday.me/bug/20190709/1409169.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有