Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.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
Mysql 连接表的替代方案?_Mysql_Database_Database Design_Many To Many_Relational Database - Fatal编程技术网

Mysql 连接表的替代方案?

Mysql 连接表的替代方案?,mysql,database,database-design,many-to-many,relational-database,Mysql,Database,Database Design,Many To Many,Relational Database,我正在设计一个关系数据库表,用于存储有关我需要存储的电子商务场景的数据 用户购买的产品列表 购买特定产品的用户列表 这是一种多对多的关系 到目前为止,我只能考虑这样做。 创建用于存储订单的表 table recordorders( userID // foreign key from users table productID, // foreign key from products table dateofpurchase,

我正在设计一个关系数据库表,用于存储有关我需要存储的电子商务场景的数据

  • 用户购买的产品列表
  • 购买特定产品的用户列表
这是一种多对多的关系


到目前为止,我只能考虑这样做。
创建用于存储订单的表

    table recordorders(
       userID // foreign key from users table
       productID, // foreign key from products table
       dateofpurchase,
       quantity,
       price_per_unit,
       total_amount
    )
它将起到连接表的作用。


这是一种很好的方法吗?除了连接表,还有其他更有效的查询方法吗?

您的项目符号描述了两个表,而不是一个表。您的连接表没有正确地描述为两个列表。它是一组订单信息行。您提供的连接表包含“用户[userID]在…”上购买了产品[productID]的行。它记录订单信息。(订单的用户、产品、日期等的组合)给定用户或产品,可以通过查询订单信息表获得相应的项目符号表

但是,您的表可能需要另一个具有唯一订单id的列。否则,它无法记录所有这些列中有两个相同的订单。(例如,如果同一个人在同一日期以相同的数量、价格和总额购买相同的产品)即其行与订单可能不是1:1。这就是为什么我在上面称它为订单信息表而不是订单表。它记录了某些秩序具有这些属性;但是如果有相同信息的订单,它不会记录不同的订单。这真的是一个多对多对等(针对每个专栏)的关联。这就是为什么会选择订单id作为订单的唯一名称作为进一步信息。这个新表将被称为实体表,而不是连接表或关联表。它保存“按订单[id]用户[user]购买…”的行

PS订单通常可以描述为订单id、用户、订单行集合(产品、数量、价格和总额)和其他内容(日期、总计等)之间的关联。订单通常通过订单id上的订单实体表及其用户、日期等,加上订单id上的订单行关联表及其订单行信息进行关联

PPS是时候读一本关于信息建模和数据库设计的书了。

如果不将这两件事“存储”在表中(连接或其他),您可以从原始(“事实”)数据中发现它们:

使用建议的表格:

用户购买的产品列表:

SELECT productID
    FROM recordorders
    WHERE userID = 123;
购买特定产品的用户列表:

SELECT userID
    FROM recordorders
    WHERE productID = 987;

那么我应该如何存储它呢?@AnkitDeshpande他说,使用你建议的表!正如我在回答中所解释的,您的表格没有正确地描述为“两个列表”。它是一组订单信息行。这个答案给出了我在回答中提到的查询:“给定一个用户或产品,您可以通过查询该表来获得相应的项目符号。”您能推荐一些书吗?请参阅:Re fundamentals of relational databases,Darwen的第一本书。t第三个是它的SQL伴侣。他的作品是在线的,当与广告一起下载时是免费的。这是我所知道的最好的文本。(尽管它在创建数据库时并不完全理解关系模型。)它有一章介绍如何转换为其他方法和图表。所以这真的是最好的指南。我注意到他有一本较新的书《面向从业者》。我刚刚对我的答案进行了重要的编辑。我指出了这样一个事实,即您建议的表可能与您想要记录的顺序不完全相同,并且您想要的是实体表而不是连接/关联表。