我目前正在使用Laravel框架,我注意到有些问题让我质疑我的数据库设计。
我目前有下表products
,其中每条记录代表一个产品,它包含prices
表的外键,代表与产品相关的价格/货币。
+-----------+---------+----------+-----+-----------+
|product_id |price_id |seller_id |title|description|
+--------------------------------------------------+
| | | | | |
| | | | | |
| | | | | |
| | | | | |
+-----------+---------+----------+-----+-----------+
现在,我正在查看描述模型here之间关系的Laravel文档。我将在此关系中使用的及物动词是Product
具有 Price
。但是,根据Laravel文档,我需要使用" belongsTo"而不是" hasOne"功能(即产品属于价格)。这个功能正常,但是使用错误的及物动词似乎有些奇怪且不易读,这就是我对数据库设计提出质疑的原因。
为了使用" hasOne"在Laravel的关系中,我必须反转外键的方向,而是使prices
表具有与价格相关联的产品的外键。
产品表:
+-----------+----------+-----+-----------+
|product_id |seller_id |title|description|
+----------------------------------------+
| | | | |
| | | | |
| | | | |
| | | | |
+-----------+----------+-----+-----------+
价格表:
+-----------+----------+------+----------+
|price_id |product_id|amount|currency |
+----------------------------------------+
| | | | |
| | | | |
| | | | |
| | | | |
+-----------+----------+------+----------+
哪种设计是正确的设计?对我来说,在price_id
表格中添加products
列更有意义,这样您就可以在查看表格时立即看到product
与price
相关联。它似乎也更有效率,因为您通过它的主要索引查找价格,而不是通过查找product_id列来查询价格。
答案 0 :(得分:1)
这取决于您的业务规则。在大多数情况下,price
将是product
的属性。换句话说,价格只是产品表上的一列。
这种简单的情况可能会有并发症。
例如,您可能对同一产品有不同的价格,具体取决于您将其销售给谁。或者您可能会随着时间的推移存储产品价格的变化历史记录。在这种情况下,您有一个:多个关系(一个product
有很多prices
)。
另一方面,您可能有一个更专业的案例,例如销售小件硬件包或按重量销售的某种干货。想想去Home Depot并看到小小的泡罩包装,其价格如" $ AA"," $ BB"这些符号转化为一定数量的美元和美分,随着时间的推移而变化。在这种情况下,你有一个:很多在另一个方向,即一个price
有很多products
。
在这种情况下要记住的重要一点是,你不会这样做,除非你刻意改变锁步的所有价格。如果花费1.50美元的所有东西一次性价格变为1.55美元,那么第二种情况可能是正确的。
您应该从不做什么,当该关系是巧合时,将子记录链接到单个父记录。换句话说,仅仅因为产品A和产品B恰好具有相同的价格,这种平等可能是巧合,所以你不应该从产品表中取出价格并制作一个价格表,只是因为有些东西巧合地共享价格。
为了能够回答您的问题,您需要首先弄清楚您的业务规则究竟是什么,更具体地说,每种产品的价格是多少,以及以有意义的方式或巧合相关的不同产品的价格办法。这将帮助您推动数据模型,并从那里开始您的Laravel动词。