【问题标题】:Need to select from multiple tables based upon records in one table需要根据一张表中的记录从多张表中进行选择
【发布时间】:2011-05-02 18:22:35
【问题描述】:

这里的情况。我有一个称为地图坐标的表,其架构如下所示:

map_coordinates:
item | item_id | latitude | longitude

这个想法是这个表包含不同项目的坐标列表,它们可以是便条、分类帖子、事件等。我希望能够设置它,所以我的结果集如下:

item | name of item | latitude | longitude

请考虑所有事件、分类和注释都在单独的表格中。我怎么能设置它,因为我需要在谷歌地图上显示所有坐标以及元素的名称,即如果它是分类 - 广告的标题,事件的标题等,而不必做很多sql查询。

我有在地图上显示它的代码 - 我只需要这样获取详细信息。还是我必须在这里重做我的数据库设计?

==========================

编辑

实际上,我的数据库中有许多表,例如注释、分类和事件等。关键是 maps_coordinates 表中的项目是指元素的类型,即它是否是注释或事件,并且 item_id 是该事件的实际 ID。我不想在这里使用连接,因为这会涉及很多表。此外,我只需要获取标题中的基本信息以帮助填充地图,因此当我将鼠标悬停在单个标记上时,我不必进行 ajax 调用来显示标记处元素的基本信息。

其他表有它们自己的定义,但它们都有一个相似的标题字段,我希望将这个标题字段显示在与坐标相同的元组中。或者我应该在这里非规范化我的表格并在 map_coordinates 中有一个重复的标题条目?

【问题讨论】:

  • 在@Georgi 注释的评论中,您提到了一个包含注释名称的 NOTES 表。请编辑您的原始帖子以包含所有其他相关表格的描述 - 否则人们可以给您的建议不多。

标签: sql mysql normalization


【解决方案1】:

您可以通过创建一个视图来组合不同表格中的每个公共元素来实现此目的。在您的示例笔记中,分类帖子、事件等。

CREATE VIEW viewCommonElements
AS

SELECT 
100      as DataType,
NoteId   as ElementId,
NoteName as ElementName
FROM Notes

UNION

SELECT 
200                as DataType,
Classified_Post_Id as ElementId,
Post_Description   as ElementName
FROM Classified_Posts

UNION

SELECT 
300                as DataType,
EventId            as ElementId,
EventName          as ElementName
FROM Events

只需为您希望包含在公共元素中的每个表添加一个新的 DataType。您现在可以设置一个连接到 viewCommonElements 视图的查询。

如果稍后创建了一个新元素,只需修改视图并添加一个 联合选择块,为它提供一个唯一数据类型。您可以使用 DataType 来区分不同的公共元素。

我已经多次使用这种方法来协调不同但常见的数据。

【讨论】:

  • +1 根据经验,我会建立一个规范化的数据库,但将这些需求放在一个视图中。您不想因为有太多表而使您对数据库的写入变得复杂。上面科德角的回答是一个很好的起点。
  • @raja - 很多时候,我们都被一个正在工作的现有数据库设计困住了(不是很好,但工作)。然后出现了新的需求,要求我们在并非真正为此目的设计的数据库上创造奇迹。
【解决方案2】:

是的,基本上你的数据库设计不好。试试这样:

map_coordinates:
item | item_id | item_type | item_name | latitude | longitude

并为 item_types 使用查找表。

【讨论】:

  • 实际上项目是项目类型例如:注释有一个条目作为项目:注释,项目ID:注释的ID..但我需要一种从注释表中获取注释标题的方法在与注释坐标相同的元组中......
【解决方案3】:

您说“这个想法是该表包含不同项目的坐标列表,它们可以是便条、分类帖子、事件等”。这是否意味着不同的项目有不同的表?如果是这样,包含所有查找信息的非规范化表可能是您最好的选择。如果没有,这只是加入两个表的问题。

【讨论】:

  • 作为后续,如果使用得当,反规范化并不是一件坏事。如果优化得当,任何重大范围的项目都将使用规范化和非规范化数据结构。
  • 是的,它就是这样——不同元素的不同表——你能在这里展示一下什么样的非规范化表的模式吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-08
  • 1970-01-01
  • 1970-01-01
  • 2018-09-24
  • 2021-03-03
  • 2012-01-07
相关资源
最近更新 更多