数据库中的一对一关系

时间:2015-01-13 00:33:38

标签: mysql database laravel database-design

我目前正在使用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列更有意义,这样您就可以在查看表格时立即看到productprice相关联。它似乎也更有效率,因为您通过它的主要索引查找价格,而不是通过查找product_id列来查询价格。

1 个答案:

答案 0 :(得分:1)

这取决于您的业务规则。在大多数情况下,price将是product的属性。换句话说,价格只是产品表上的一列。

这种简单的情况可能会有并发症。

例如,您可能对同一产品有不同的价格,具体取决于您将其销售给谁。或者您可能会随着时间的推移存储产品价格的变化历史记录。在这种情况下,您有一个:多个关系(一个product有很多prices)。

另一方面,您可能有一个更专业的案例,例如销售小件硬件包或按重量销售的某种干货。想想去Home Depot并看到小小的泡罩包装,其价格如" $ AA"," $ BB"这些符号转化为一定数量的美元和美分,随着时间的推移而变化。在这种情况下,你有一个:很多在另一个方向,即一个price有很多products

在这种情况下要记住的重要一点是,你不会这样做,除非你刻意改变锁步的所有价格。如果花费1.50美元的所有东西一次性价格变为1.55美元,那么第二种情况可能是正确的。

您应该从不做什么,当该关系是巧合时,将子记录链接到单个父记录。换句话说,仅仅因为产品A和产品B恰好具有相同的价格,这种平等可能是巧合,所以你不应该从产品表中取出价格并制作一个价格表,只是因为有些东西巧合地共享价格。

为了能够回答您的问题,您需要首先弄清楚您的业务规则究竟是什么,更具体地说,每种产品的价格是多少,以及以有意义的方式或巧合相关的不同产品的价格办法。这将帮助您推动数据模型,并从那里开始您的Laravel动词。