在 sql 数据库中存储同质分隔列表

Storing a homogenous delimited list in sql database

我正在尝试在关系数据库中建模 "retail store"。 一家商店有

  1. 唯一的 ID
  2. 所有者 ID
  3. 可能有多个出口
  4. 一家商店的所有网点都将拥有同一所有者。
  5. 商店的所有门店可能有也可能不同。可能有一些产品在一个门店有售,而在同一家零售店的另一家门店可能没有。

我的table

Products
  productId*
  productPrice
  fooAndBars

Store
  outletId*
  ownerId
  fooAndBars

productStoreJoin
  productId        \__Primary key
  ownerId          /

我的问题:

可能有一些产品在一个商店有售,而在另一个商店可能没有。 要获取一个 outlet 的所有产品,我将查询 join table。但是我会得到所有的产品,即使它在那个商店不可用,因为我将使用 ownerId 进行查询。

我能想到的解决方案:

  1. 在联接中使用 outletId 而不是 ownerId table。但是,一个奥特莱斯中将有大约 1000 种产品,而一家商店可能有大约 100 个奥特莱斯,对于单个商店,这相当于 join table 中的 10^5 行! 在连接中使用 ownerId table 从而将其减少到 1000 行!

  2. 在联接中添加另一列 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 列表从来都不是一个好主意。