我目前有3张桌子

Users (Id, PositionId)
MonsterInstances (Id, PositionId)
TreasureInstances (Id, PositionId)


和1个位置表。

Positions (Id, Coordinate, TypeId)


我的3个表中的PositionId是我的Position表中的外键。

我想使用一个Positions表,如上所示,以标准化我的所有位置数据。我面临的问题是我必须标识一个类型,以便在执行查询时知道要查询的表。

例如

SP  -- GetObjectByPosition (positionId)

IF TypeId = 1
SELECT * FROM Users JOIN... WHERE PositionId = positionId
ELSE IF TypeId = 2
SELECT * FROM MonsterInstances JOIN...


这对我来说似乎是不好的设计。我可以理解的唯一方法是拥有3个单独的表。

UserPositions
MonsterInstancePositions
TreasureInstancePositions


但是,我并不总是对提取用户,怪物或宝藏数据感兴趣。有时我只想要位置ID和位置-这意味着要使用三个表,我必须进行并集。

有一个更好的方法吗?

最佳答案

用户,MonsterInstances,TreasureInstances可以重写为包含类型列的单个“ ObjectInstances”表。然后,分别对这3个表起作用的查询将对ObjectInstances和一个typeID起作用,并引用一个新的OjbectTypes表。合理?

08-03 13:50