假设我有一个表(数十万行),我的用户存储他们的游戏结果。在一排,连同6个结果,我存储了他们玩时使用的“对象”和他们使用的“技术”。在我的情况下,大约有30种可能的不同对象和10种可能的不同技术。每一个对象和技术都是一个字长。
根据规范化,我将创建一个“对象”和“技术”表,其中每个对象和技术都被赋予一个唯一的ID,然后使用外键将它们从列出所有结果的大表中链接起来。所以,与其把对象的名字放在大表中,我应该有一个1-30的数字。
我的用户将在大表中执行许多查询来搜索结果WHERE object = "objectname" AND technique = "techniquename"。如果我使用外键,我将需要3个查询,而不是一个(首先获得objectID和techniqueID,最后搜索大表中匹配的结果)。
那么,考虑到数据库将收到3倍多的查询,这是否值得呢?
发布于 2015-11-09 03:31:24
通常不会有3个查询,而是有一个连接了三个表的查询。只要在所有外键上都有工作索引,速度上的差异是可以忽略不计的,健壮性方面的增益是无价的(还有更好的空间效率,但今天的磁盘很便宜,因此这是次要的兴趣)。
SELECT *
FROM hundreds_of_thousands R
JOIN techniques T ON T.id = R.technique_id
JOIN objects O ON O.id = R.object_id
WHERE O.name = "objectname"
AND T.name = "techniquename"https://stackoverflow.com/questions/33602076
复制相似问题