0

我添加了一个迁移,以根据以下命令将现有数据库的主键从自动生成的系统主键更改为复合键:

add_index :listings, [:telephone, :name, :latitude, :longitude] , :unique=>true

我的问题是:

  1. 该命令生成的索引将是一个整数?由于所有参数字段都是字符串。

  2. 如果我在创建数据库后运行此命令,它会重新生成所有行的键还是我必须为此运行单独的命令?

  3. 运行此命令时会有所不同吗?如果在运行时表中没有行,而不是在表有行之后运行?

谢谢

阅读下面的帖子后编辑:============================================ =========

这是我的模型:

# Table name: listings
#
#  id                :integer         not null, primary key
#  name              :string(50)      default("ERROR:Not Available"), not null
#  telephone         :string(15)      default("ERROR:Not Available"), not null
#  latitude          :string(15)      default("ERROR:Not Available"), not null
#  longitude         :string(15)      default("ERROR:Not Available"), not null
#  avatar           :string(30)      default("Not Available")

所以你可以看到主键是系统自动生成的 id 当我添加上面的命令时,那到底是做什么的呢?我认为它更改了 id 字段,使其成为基于 4 列值生成的整数。

您可以猜到,可能有超过 2 个同名的人。所以在这里保证唯一性的唯一真正方法是基于 4 列创建某种索引。

通过使用上面的命令,我做对了吗?这会加快查询速度吗?

4

1 回答 1

2
  1. 这不会改变你的主键。仅创建和索引,用于提高查询性能(如果使用正确)
  2. 索引没有类型,它就像一个地图,而不是一个列。
  3. 似乎 Rails 不支持复合键。

也许你的解决方案: http ://compositekeys.rubyforge.org/


编辑: 如果您唯一关心的是唯一性,您应该知道 Active Record(Rails 中的模型)带有验证功能。因此,您不需要为该建议创建索引,也不需要创建 compose id。

+info => http://guides.rubyonrails.org/active_record_validations_callbacks.html#uniqueness

您可能还想看看什么是数据库索引: http ://en.wikipedia.org/wiki/Database_index

读完之后,您应该明白,如果您需要加快查询速度,创建该索引的唯一原因是:

SELECT * FROM listings WHERE telephone=123123 AND name="John" AND latitude=123 AND longitude=323

而且我很确定您不需要在您已经知道所有这些值的情况下进行此类查询。

于 2012-04-28T16:30:13.923 回答