[英]One to One relationship in a database
我目前正在使用Laravel框架,并且注意到一些使我质疑数据库设计的问题。
我目前有以下表格products
,每个记录代表一个产品,并且它包含一个prices
表的外键,代表与该产品关联的价格/货币。
+-----------+---------+----------+-----+-----------+
|product_id |price_id |seller_id |title|description|
+--------------------------------------------------+
| | | | | |
| | | | | |
| | | | | |
| | | | | |
+-----------+---------+----------+-----+-----------+
现在,我期待在描述对象之间的关系的Laravel文档这里 。 我在这种关系中使用的及物动词是“ Product
具有 Price
。 但是,根据Laravel文档,我需要使用“ belongsTo”而不是“ hasOne”函数(即,产品归属于价格)。 这可以正常运行,但是使用错误的及物动词似乎有点奇怪并且可读性差,这就是为什么我质疑数据库设计的原因。
为了在Laravel中使用“ hasOne”关系,我必须反转外键的方向,而是让prices
表具有与价格相关联的产品的外键。
产品表:
+-----------+----------+-----+-----------+
|product_id |seller_id |title|description|
+----------------------------------------+
| | | | |
| | | | |
| | | | |
| | | | |
+-----------+----------+-----+-----------+
价格表:
+-----------+----------+------+----------+
|price_id |product_id|amount|currency |
+----------------------------------------+
| | | | |
| | | | |
| | | | |
| | | | |
+-----------+----------+------+----------+
哪种设计是正确的设计? 对我来说,在products
表中具有price_id
列更有意义,因此在查看该表时,您可以立即看到某个product
与price
相关联。 这似乎也更有效,因为您正在通过它的主索引查找价格,而不是通过查找product_id列查找价格。
这取决于您的业务规则。 在大多数情况下, price
将是product
的属性。 换句话说,价格只是产品表上的一列。
在这种简单的情况下可能会出现复杂情况。
例如,您对同一产品的价格可能不同,具体取决于您将其出售给谁。 或者您可能会存储一段时间内产品价格变化的历史记录。 在这种情况下,您具有一对多的关系(一种product
prices
)。
另一方面,您可能有一个更专业的案例,例如出售按重量出售的小件硬件包装或某种干货。 想想去家得宝(Home Depot),然后看到价格像“ $ AA”,“ $ BB”之类的小泡罩包装,这些符号会转换成一定数量的美元和美分,随着时间的流逝而变化。 在这种情况下,您在另一个方向上有一个:很多,即一个price
有很多products
。
在这种情况下要记住的重要一点是,除非您故意要锁定所有价格,否则您将不会这样做。 如果所有花费$ 1.50的东西都一次将价格更改为$ 1.55,那么第二种情况可能是正确的。
当这种关系是巧合时,您永远不要将子记录链接到单个父记录。 换句话说,仅仅因为产品A和产品B碰巧具有相等的价格,该相等可能是巧合 ,所以您不应该将价格从产品表中取出并制成价格表,只是因为某些事情是偶然地共享价格。
为了能够回答您的问题,您需要首先弄清楚您的业务规则是什么,更具体地说,每种产品有多少价格以及不同产品的价格是以有意义的方式还是巧合的方式相关。 这将帮助您推动数据模型,并从那里合理地跟随Laravel动词。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.