哪个更好:has_one(单列表)还是字符串列?

时间:2011-10-15 00:12:04

标签: mysql ruby-on-rails join

假设我有一个名为cities(id,name)的表,另一个名为people(id,name,city_id)。

现在,您可以根据需要添加任意数量的城市,没有任何限制,因此,在这种情况下,city列在people内以及何时更好我希望得到不同的城市,我可以致电DISTINCT

复杂性我是否比灵活性更好地保存?

加入我比我必须使用的不同保存得更好吗?

city列设置为索引,是否与在另一个表中查找ID一样快?

我必须说,在我正在处理的应用程序中,我有大约5个这样的表,所以它就像很多连接一样。

2 个答案:

答案 0 :(得分:1)

如果您的所有用户都拥有不同的城市,那么DISTINCT将会运作得相当好。但是,来自同一城市的人越多,不分离数据的开销就越大。最佳案例优化将是对city列索引的唯一扫描。

将city列放在people表中也会减慢对people表的某些访问请求。

复杂性可以保持您的城市表的数据质量。假设有适当的元数据可用,则验证已添加的新城市相当简单。允许您清理诸如拥有城市'Newyork','new york','New York'和'new York'等问题

哪种方法更快的问题实际上取决于应用程序。如果在访问某个人的记录时总是需要城市,那么将城市置于个人记录中可能会更快。如果您经常需要一个城市列表,那么将它们放在一个单独的表中会更好。

拥有额外的表可能会使您的查询更复杂一些。但是,您可能会获得重要的数据质量。将city列放在people表中可以获得的灵活性可能会牺牲数据质量。

您的数据库设计师似乎做得很好。

答案 1 :(得分:0)

您可以随时缓存cities表。如果使用字符串,则会丢失面向对象。假设你想要一个城市的缩写。或者城市has_many zip_codes ...或city has_many area_codes。现在,您将很难升级您的应用程序。

你总是可以做这样的事情来丢失额外的查询......

def city_name
  Rails.cache.fetch("city-#{city_id}-name", :expires_in => 1.days) do
    city.name
  end
end

你也应该使用belongs_to而不是has_one