这有点难以搜索,因为所涉及的单词在关系数据库领域是通用的,所以如果这是重复的,请指出我正确的方向。
说我有一个'热点'表。假设热点可能出现在任意数量的链接表中。我不想在所有链接表中进行不必要的查询,我想指定一个“热点”类型,所以我可以先得到我的结果,只找到特定类型的关系。
制作一个引用链接表真实名称的'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坐标)与任何其他一组动作/收藏品/游戏。游戏表与收藏品表的架构截然不同。
答案 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
字段没有任何好处,值得管理类型列的困难。如果这不是你所描述的,请告诉我,我可以解决这个问题。