【问题标题】:Combining data from multiple tables based on the first table根据第一个表合并多个表中的数据
【发布时间】:2013-11-15 22:51:00
【问题描述】:

我有一张满是物品的桌子,目前只有一种类型,关于该物品的所有内容都在同一张桌子上。现在我想再添加两种类型。每种类型都有许多列(>10)是唯一的,所以我不想在表中有 30 列时其中 20 列是空值,所以我正在考虑将它们拆分:

tbl_items_common
tbl_items_type1 [for data unique to this type]
tbl_items_type2 [for data unique to this type]
tbl_items_type3 [for data unique to this type]

所有表格都有一个公共字段“id”,用于匹配项目和数据。

现在我在考虑编码和思考:

我应该把这些分开吗,还是应该只有一张大桌子。使插入和查询更容易,但数据库有点“混乱”。

拆分数据会使数据库更加孤立,但会使代码更加复杂。

或者,我可以只使用 3 个完全独立的表,它们之间的某些列相同,但是我不确定如何生成一个在所有 3 个表中唯一的唯一 ID。

如果我决定拆分数据,是否可以在一个查询中获取所有数据(可能是嵌入案例/选择?),或者我必须先执行 SELECT 以查找项目类型,然后再查找另一个获取其余数据?在报告方面并不漂亮。

那么我想知道什么? (1) 你会选择哪种方法,(2) 如果你选择第二种,你会如何查询这些数据?

【问题讨论】:

  • 你可以这样做:创建一个表types然后你有你的表itens然后创建一个表itens_types这是一个多对多的关系。如果需要,您可以拥有一个表 types_attributes,然后您将获得类型和 itens 所需的信息。

标签: mysql sql sql-server tsql


【解决方案1】:

您有几个选择。就个人而言,我会将您项目的所有重要(和类似)数据保留在一个表中,并有 3 列包含详细 ID,然后您可以创建几个不同的表,其中包含每种类型的额外数据和 JOIN每个查询的数据。

另一种选择是您可以拥有三个包含项目的单独表格,但我不建议这样做,因为这不是良好的数据库设计实践。如果您确实想这样做,您可以在一个查询中从所有三个表中进行选择: SELECT * FROM table1, table2, table3

...或使用空值手动匹配列数并执行UNION查询:

SELECT f1, f2, f3, f4, null as f5 FROM table1
UNION ALL
SELECT f1, f2, f2, null as f4, null as f5 FROM table2
UNION ALL
SELECT f1, f2, f3, f4, f5 FROM table3 -- table 3 contains 5 columns as an example

...但是如果每种类型都有很多独特的列,那也可能会变得混乱。我建议为每个项目类型的详细信息使用三个单独的表格:

SELECT * FROM items I
LEFT JOIN item_type1 I1 ON I.item1_detail_id = I1.id
LEFT JOIN item_type2 I2 ON I.item2_detail_id = I2.id
LEFT JOIN item_type3 I3 ON I.item3_detail_id = I3.id

【讨论】:

  • 哦,是的,当然。现在很明显,感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多