在 sql 数据库中存储同质分隔列表
Storing a homogenous delimited list in sql database
我正在尝试在关系数据库中建模 "retail store"。
一家商店有
- 唯一的 ID
- 所有者 ID
- 可能有多个出口
- 一家商店的所有网点都将拥有同一所有者。
- 商店的所有门店可能有也可能不同。可能有一些产品在一个门店有售,而在同一家零售店的另一家门店可能没有。
我的table
Products
productId*
productPrice
fooAndBars
Store
outletId*
ownerId
fooAndBars
productStoreJoin
productId \__Primary key
ownerId /
我的问题:
可能有一些产品在一个商店有售,而在另一个商店可能没有。
要获取一个 outlet 的所有产品,我将查询 join table。但是我会得到所有的产品,即使它在那个商店不可用,因为我将使用 ownerId 进行查询。
我能想到的解决方案:
在联接中使用 outletId 而不是 ownerId table。但是,一个奥特莱斯中将有大约 1000 种产品,而一家商店可能有大约 100 个奥特莱斯,对于单个商店,这相当于 join table 中的 10^5 行!
在连接中使用 ownerId table 从而将其减少到 1000 行!
在联接中添加另一列 table "outletIds" 这将是一个逗号分隔的 outletIds 列表,其中包含具有该产品的商店列表。所以它看起来像这样 -
productId ownerId outletIds
56 2 [1001, 1005, 1008, 1009]
57 2 [1001, 1005, 1008]
...
解决这个问题的正确方法应该是什么?
绝对是#1。如果您需要知道哪些产品在哪些商店有售,您应该有一个连接 table 将产品映射到商店。预计此 table 有很多行,一个商店有 10^5 行就可以了。 MySQL 对于使用整数值的连接查询非常快。为了与您的命名约定保持一致,我会将连接 table 重命名为 productOutletJoin
.
您的 #2 方法对于像 "which products are in outlet 1008?" 这样简单的查询来说将是一场噩梦,想象一下尝试使用该模式插入、更新或删除数据。存储 comma-separated 个 ID 列表从来都不是一个好主意。
我正在尝试在关系数据库中建模 "retail store"。 一家商店有
- 唯一的 ID
- 所有者 ID
- 可能有多个出口
- 一家商店的所有网点都将拥有同一所有者。
- 商店的所有门店可能有也可能不同。可能有一些产品在一个门店有售,而在同一家零售店的另一家门店可能没有。
我的table
Products
productId*
productPrice
fooAndBars
Store
outletId*
ownerId
fooAndBars
productStoreJoin
productId \__Primary key
ownerId /
我的问题:
可能有一些产品在一个商店有售,而在另一个商店可能没有。 要获取一个 outlet 的所有产品,我将查询 join table。但是我会得到所有的产品,即使它在那个商店不可用,因为我将使用 ownerId 进行查询。
我能想到的解决方案:
在联接中使用 outletId 而不是 ownerId table。但是,一个奥特莱斯中将有大约 1000 种产品,而一家商店可能有大约 100 个奥特莱斯,对于单个商店,这相当于 join table 中的 10^5 行! 在连接中使用 ownerId table 从而将其减少到 1000 行!
在联接中添加另一列 table "outletIds" 这将是一个逗号分隔的 outletIds 列表,其中包含具有该产品的商店列表。所以它看起来像这样 -
productId ownerId outletIds
56 2 [1001, 1005, 1008, 1009]
57 2 [1001, 1005, 1008]
...
解决这个问题的正确方法应该是什么?
绝对是#1。如果您需要知道哪些产品在哪些商店有售,您应该有一个连接 table 将产品映射到商店。预计此 table 有很多行,一个商店有 10^5 行就可以了。 MySQL 对于使用整数值的连接查询非常快。为了与您的命名约定保持一致,我会将连接 table 重命名为 productOutletJoin
.
您的 #2 方法对于像 "which products are in outlet 1008?" 这样简单的查询来说将是一场噩梦,想象一下尝试使用该模式插入、更新或删除数据。存储 comma-separated 个 ID 列表从来都不是一个好主意。