【问题标题】:Correct way to design Many To Many Relationship设计多对多关系的正确方法
【发布时间】:2019-12-30 21:38:54
【问题描述】:

我正在用 Java 编程语言开发一个软件,并使用 MySQL 作为数据库。 该软件收集用户的一些输入,然后计算/选择他/她需要的产品。 首先,他/她创建一个项目(应该创建一个名为项目的表)并计算/选择产品,然后将它们添加到项目中。 产品字段彼此不同。(因此我们为每个名为 A、B、C 的产品都有不同的表) 例如,我有 3 种类型的产品,每种产品都有特定的字段并且彼此不同,因此用户选择/计算每种产品的方式都不同。 产品 A 有 3 个字段(产品 ID、名称、型号) 产品 B 有 7 个字段(product_id, name, color, company name, ....) 产品 C 有 14 个字段(product_id、name、company name、made by、created by、......) 我不能将这些产品视为一个,因为领域不同。 每个产品可以在多个项目中,每个项目可以有几种类型的产品。(多对多关系) 每个项目都必须保存产品。 在这种情况下,我应该在每个产品表和项目之间创建多对多关系吗?如果是,我以后如何再次检索项目? 这种情况的最佳做法是什么? 如何将这 3 个产品表视为一个?

【问题讨论】:

  • “这种情况的最佳实践是什么?” 如果您确实需要动态键值 (EAV) 存储,一些选项是:1) MySQL 8 Document Store 2) MySQL “NoSQL”更好地表示使用 InnoDB memcached Plugin 的键值存储 3) MariaDB 的 dynamic columns 4) 使用 XML (TEXT)、JSON 数据类型 5) 使用像 mongodb 这样的 NoSQL DBMS
  • @RaymondNijland:谢谢你的回复,我看过一些关于订单和物品的样本。(多对多)但在那些样本中,似乎物品字段是相同的,只有在现有的项目类型(我对吗?)这是一个小型桌面软件。你告诉我如果我想继续使用 RDMBS,唯一正确的方法是动态键值?对吗?还有任何使用 XML 或 JSON 数据类型的 url?
  • 品味和意见的问题..您也可以在数据库中使用EAV (entity-attribute-value) 存储..问题是当您存储无模式数据时,为什么首先使用关系数据库...另外一个问题是当您需要将记录转换为列以便应用程序可以更轻松地使用它时,您将需要对其进行透视..
  • @RaymondNijland 这是一个粗略的软件,基于数据库(少计算,多选择!),我们的数据在 excel 文件中。我选择 RDBM 的原因之一是很容易将 excel 文件导入 mysql。(在 excel 中存在一些工具)另一个是我不熟悉这种技术。(EAV 恶魔!)我会尝试让你知道。跨度>

标签: java mysql many-to-many


【解决方案1】:

您可能想要创建一个 JOIN 表来管理其他两个表中记录之间的相互关系。

例如:

  • 项目(project_id,project_name)
  • 产品(product_id、product_name)
  • project_products (pp_project_id, pp_product_id)

这样你可以:

  • 在定义相互关系之前创建项目和产品
  • 轻松定义项目和产品之间的相互关系,而无需创建复杂的架构

使用示例:

项目表:

project_id  |  project_name
------------+----------------
 1          | Country market
 2          | City carnival

产品表:

product_id   |  product_name
-------------+---------------
 101         | Candy floss
 102         | Cheeseburger
 103         | Hamburger
 104         | Pizza - Hawaiian

project_products 表:

pp_project_id  |  pp_product_id
---------------+----------------
1              | 101
1              | 103
1              | 104
2              | 101
2              | 102
2              | 104

在上面的例子中...

  • 项目 1 有 3 个针对它的产品
  • 项目 2 有 3 个针对它的产品
  • 产品 101 和 104 都记录在 2 个项目中
  • 仅针对 1 个项目记录剩余产品

【讨论】:

  • 我没看懂,你能解释一下吗?你的意思是如果我有 3 个产品表(每种类型一个)我创建三个与项目表表的多对多连接?那么我该如何检索数据呢?
  • 我的示例演示了如何在两个表之间定义多对多关系,而不是三个。如果您有多个产品表,那么您可能需要将它们聚合为一个(如果可行),因为这样可以简化事情,否则您可以创建一个视图将它们显示为一个表,但确保每条记录都有一个唯一的主 id 值。跨度>
  • 我已经扩展了答案,以展示我的答案从数据角度来看的样子。
猜你喜欢
  • 2018-10-20
  • 2013-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-22
  • 1970-01-01
  • 2019-07-24
  • 1970-01-01
相关资源
最近更新 更多