Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在sql数据库中存储同质分隔列表_Sql_Database_Database Design_Relational Database_Database Schema - Fatal编程技术网

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

在sql数据库中存储同质分隔列表,sql,database,database-design,relational-database,database-schema,Sql,Database,Database Design,Relational Database,Database Schema,我试图在关系数据库中对“零售商店”进行建模。 一家商店 唯一的Id 所有者Id 它可能有多个出口 一家商店的所有门店都有相同的店主 一家商店的所有门店都可能有相同的产品,也可能没有。在同一家零售店的另一家门店可能无法买到某个门店提供的某些产品 我的桌子 Products productId* productPrice fooAndBars Store outletId* ownerId fooAndBars productStoreJoin productId

我试图在关系数据库中对“零售商店”进行建模。 一家商店

  • 唯一的Id
  • 所有者Id
  • 它可能有多个出口
  • 一家商店的所有门店都有相同的店主
  • 一家商店的所有门店都可能有相同的产品,也可能没有。在同一家零售店的另一家门店可能无法买到某个门店提供的某些产品
  • 我的桌子

    Products
      productId*
      productPrice
      fooAndBars
    
    Store
      outletId*
      ownerId
      fooAndBars
    
    productStoreJoin
      productId        \__Primary key
      ownerId          /
    
    我的问题是:

    可能有一些产品在一个销售点可用,而在另一个销售点可能不可用。 要获取一个门店的所有产品,我将查询联接表。但我会得到所有的产品,即使它在该销售点不可用,因为我将查询ownerId

    我能想到的解决方案是:

  • 在联接表中使用outletId而不是ownerId。但是,一个门店将有大约1000种产品,一个门店可能有大约100个门店,这相当于单个门店联接表中的10^5行! 在联接表中使用ownerId将其减少到1000行

  • 在联接表“outletIds”中添加另一列,该列将是一个逗号分隔的outletIds列表,其中包含具有该产品的插座列表。所以看起来是这样的-



  • 解决这个问题的正确方法应该是什么

    肯定是。如果您需要知道哪些产品在哪些门店可用,那么您应该有一个将产品映射到门店的联接表。这个表应该有很多行,一个存储10^5行就可以了。MySQL对于使用整数值的连接查询非常快速。根据您的命名约定,我将联接表重命名为
    productOutletJoin

    对于像“outlet 1008中有哪些产品?”这样简单的查询,您的#2方法将是一场噩梦,想象一下尝试使用该模式插入、更新或删除数据。存储以逗号分隔的ID列表从来都不是一个好主意。

    肯定是1。如果您需要知道哪些产品在哪些门店可用,那么您应该有一个将产品映射到门店的联接表。这个表应该有很多行,一个存储10^5行就可以了。MySQL对于使用整数值的连接查询非常快速。根据您的命名约定,我将联接表重命名为
    productOutletJoin

    对于像“outlet 1008中有哪些产品?”这样简单的查询,您的#2方法将是一场噩梦,想象一下尝试使用该模式插入、更新或删除数据。存储以逗号分隔的ID列表从来不是一个好主意

    productId ownerId        outletIds
    
       56      2      [1001, 1005, 1008, 1009]
    
       57      2      [1001, 1005, 1008]