考虑一个名为users的表和一个名为votes的表。 用户具有ID和国家/地区列。 每次投票都属于一个用户,但检索投票的目的是找出它来自哪个国家。因此,您需要查询一次才能获得投票,然后查询用户表以获取国家/地区。
考虑到一个大型的,经过多次查询的数据库,是否最好只为投票表添加一个国家/地区列,并让它与用户中的一个重复或仅使用上述方法?
答案 0 :(得分:3)
是。不,也许。
你的问题的答案取决于你在问题中没有提到的几件事。首先要注意的是,在大多数情况下,VKP答案中的查询已经足够了。
其次,如果country
是完整的国家/地区名称,则存储完整的国家/地区名称(可能相当长)可能会大大扩展表格的大小。与进行连接相比,这种大小的增加实际上可能会减慢某些查询的速度。当然,对于2或3个字符的代码或者votes
中的记录宽度已经是几百个字节,这个意义要小得多。
但是,也许最重要的考虑因素是您是否希望将投票计入用户当前国家/或者您是否希望在投票时分配给用户的国家/地区进行投票?第一个选项是始终使用join
来获取当前值。第二个是在country
表中包含votes
的强烈论据。
答案 1 :(得分:1)
select v.vote_id, u.country
from users u join votes v
on u.id = v.userid
如果您需要查看投票所在的国家/地区,您可以加入表格并获取。此外,建议不要在投票表中包含国家/地区列,因为它没有意义。
答案 2 :(得分:0)
你解释它的方式,国家是用户的属性:用户"生活在"或者"是"的公民一个国家。投票是用户可以采取的行动:用户投票。
如果您在未知用户的情况下进行投票,该怎么办?这首投票如何首先被选中?必须有一些您省略的其他细节。
如果您正在搜索汇总值(" 7月份加拿大人投了多少票?")那么您还是必须加入表格 - 仅在加拿大过滤用户并仅在七月。查询"在哪些国家/地区,任何公民在7月投了至少一票?"编写代码会比较复杂,但仍然需要加入。
可以通过将国家/地区复制到投票表来消除后一个问题所需的联接。但是我认为任何性能提升都不会很重要,你必须记住,你的数据库会变得更复杂,可维护性稍差,而且不那么健壮。要想做到这一点,必须要有相当大的性能提升。