表名作为表中的“类型”字段

时间:2012-11-14 04:48:52

标签: sql syntax

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

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

制作一个引用链接表真实名称的'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'

这是一个好方法吗?是否有更高效或更好的架构来形成更简单/更快的查询?

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

1 个答案:

答案 0 :(得分: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表中的{strong> 记录中的Planes表中的记录”是不可能的afaik,但指定的类型列不保证这两者。

  • 无论如何,获得你想要的结果绝不是那么困难/慢。所有相关表的连接对于熟悉SQL的人来说同样清楚,因为switch语句决定了查询的第二部分应该是什么。它实际上可能比你描述的方式慢,因为你必须下拉整个集合,然后运行另一个查询来获得你正在寻找的结果。 SQL服务器可能会动态执行,并根据现有索引构建必要的结果。

希望这与你所描述的类似。如果是,我认为添加Type字段没有任何好处,值得管理类型列的困难。如果这不是你所描述的,请告诉我,我可以解决这个问题。