3

这有点难以搜索,因为所涉及的词在关系数据库领域是通用的,所以如果这是重复的,请指出正确的方向。

假设我有一个“热点”表。假设热点可能出现在任意数量的链接表中。我不想在所有链接表中进行不必要的查询,我想指定一个“热点”类型,这样我就可以首先得到我的结果,只找到特定类型的关系。

创建一个引用链接表真实名称的“link_type”列是不好的做法吗?例如说我有这些链接表:

table link_hotspot_collectable
table link_hotspot_minigame
table link_hotspot_factoid

以下表格是具有不同数量/类型的数据的唯一表格

table collectable
table minigame
table factoid

那么“link_type”列的可能值将是“collectable”或“minigame”(或者我想我可以使用整个链接表名称“link_hotspot_factoid”

这是一个好方法吗?是否有更有效或更好的模式来形成更容易/更快的查询?

目的是将“热点”(像素映射空间中的几何坐标)与任何其他一组动作/收藏品/游戏进行概括。游戏表将与收藏品表的架构大不相同。

4

1 回答 1

1

考虑下面的模式(把它放在通用示例中,以便我可以用更简单的方式描述它):

 ___________     _________     _____
|Cars       |   |Planes   |   |Parts|
-------------   -----------   -------
|-Id        |   |-Id      |   |-Id  |
|-RideHeight|   |-Wingspan|   |-Name|
-------------   -----------   -------
 ___________     ___________
|Plane_Parts|   |Car_Parts  |
-------------   -------------
|-PlaneId   |   |-CarId     |
|-PartId    |   |-PartId    |
-------------   -------------

我认为您要问的是是否可以更改Parts以包含类型鉴别器,它会使查询更快/更容易:

 ______
|Parts |
--------
|-Id   |
|-Name |
|-Type | (Plane, Car, etc.)
 ------

在这个新模式中,您希望执行以下操作:“我有一个零件 ID,找到零件,然后如果它是一架飞机,我将查询飞机信息而不是查看汽车”。考虑后果:

  • 您刚刚在数据库中复制了信息。在原始模型中,连接表已经声明了哪些类型的零件连接到哪种类型的车辆。您现在要添加另一列,该列必须手动设置并以未经检查的方式提供相同的信息。这很容易失去同步,给你带来很容易避免的头痛。

  • 您已经取消了将一个部件同时应用于飞机或汽车的功能。原始模式可能包含在飞机或汽车中使用的收音机,但添加类型字段会消除这种可能性。您的架构可能永远不会出现这种情况,但它会给任何试图理解您的架构的人带来困惑。不幸的是,约束:“每个部分只能连接到表中的Cars记录表中的记录Planes”是不可能的,但指定的类型列也不能保证。

  • 无论如何,获得你想要的结果从来没有那么困难/缓慢。对于熟悉 SQL 的任何人来说,所有相关表的连接就像决定查询的第二部分应该是什么的 switch 语句一样清楚。实际上,您描述的方式可能会更慢,因为您必须拉下整个集合,然后运行另一个查询以获得您正在寻找的结果。SQL Server 可能会即时执行此操作,并根据现有索引构建必要的结果。

希望这与您所描述的相似。如果是这样,我认为添加一个Type值得管理类型列的困难的字段没有任何好处。如果这不是您所描述的,请告诉我,我可以修复此响应。

于 2013-02-04T20:55:19.060 回答