gpt4 book ai didi

mysql - 数据库中的一对一关系

转载 作者:行者123 更新时间:2023-11-29 12:28:39 25 4
gpt4 key购买 nike

我目前正在与 Laravel 合作框架和我注意到一些事情让我质疑我的数据库的设计。

我目前有下表products,其中每条记录代表一个产品,并且它包含一个prices 表的外键,代表与该产品关联的价格/货币产品。

+-----------+---------+----------+-----+-----------+
|product_id |price_id |seller_id |title|description|
+--------------------------------------------------+
| | | | | |
| | | | | |
| | | | | |
| | | | | |
+-----------+---------+----------+-----+-----------+

现在我正在查看描述模型之间关系的 Laravel 文档 here 。我在这种关系中使用的及物动词是产品价格。但是,根据 Laravel 文档,我需要使用“belongsTo”而不是“hasOne”函数(即产品属于价格)。这个功能正常,但是使用错误的及物动词似乎有点奇怪并且可读性较差,这就是为什么我质疑我的数据库设计。

为了在 Laravel 中使用“hasOne”关系,我必须反转外键的方向,而是让 prices 表具有与价格关联的产品的外键与。

产品表:

+-----------+----------+-----+-----------+
|product_id |seller_id |title|description|
+----------------------------------------+
| | | | |
| | | | |
| | | | |
| | | | |
+-----------+----------+-----+-----------+

价格表:

+-----------+----------+------+----------+
|price_id |product_id|amount|currency |
+----------------------------------------+
| | | | |
| | | | |
| | | | |
| | | | |
+-----------+----------+------+----------+

哪种设计是正确的设计?对我来说,在 products 表中添加 price_id 列更有意义,这样您就可以立即看到 product查看表格时的>价格。它似乎也更有效,因为您是通过其主索引查找价格,而不是通过查找 Product_id 列来查找价格。

最佳答案

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

这个简单的场景可能会变得复杂。

例如,您对同一产品可能有不同的价格,具体取决于您的销售对象等。或者您可能会存储产品价格随时间变化的历史记录。在本例中,您具有一对多关系(一个产品有多个价格)。

另一方面,您可能有更特殊的情况,例如销售小件硬件的包装或某种按重量销售的干货。想象一下去家得宝 (Home Depot) 看到小泡罩包装,上面标有“$AA”、“$BB”等价格,其中这些符号转化为一定数量的美元和美分,并且会随着时间的推移而变化。在这种情况下,您有一个:另一个方向上的许多,即一个价格有许多产品

在这种情况下要记住的重要一点是,除非您故意要同步更改所有价格,否则您不会这样做。如果所有花费 1.50 美元的商品价格一次性变为 1.55 美元,那么第二种情况可能是正确的。

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

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

关于mysql - 数据库中的一对一关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27913170/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com