我有一个用于Rails应用程序的PostgreSQL数据库。
我想存储Facebook用户ID,所以我认为我可以使用整数,但它不够大,所以我选择了浮动。
但是现在Rails将.0添加到我的用户ID
的末尾我可以使用哪种数据类型,因此对于篇幅很长的Facebook用户ID不会发生这种情况example: 100002496803785
答案 0 :(得分:7)
您可以在整数列上使用:limit => 8
来获取bigint
。例如:
class Pancakes < ActiveRecord::Migration
def change
create_table :pancakes do |t|
t.integer :c, :limit => 8
end
end
end
然后,从psql
:
=> \d pancakes
Table "public.pancakes"
Column | Type | Modifiers
--------+---------+-------------------------------------------------------
id | integer | not null default nextval('pancakes_id_seq'::regclass)
c | bigint | not null
Indexes:
"pancakes_pkey" PRIMARY KEY, btree (id)
这是您的eight byte bigint
列。
您还可以使用字符串作为Facebook ID。你没有对ID进行任何算术运算,所以它们实际上只是看起来像大整数的不透明的包,字符串会排序和比较,所以它们可能是最好的选择。由于字符串的大小超过整数,会有一些存储和访问开销,但它可能不足以产生任何明显的差异。
永远不要将double
用于需要精确的事情。在这种情况下你可能没问题(当然尾随.0
除外),因为你有52位的尾数,这意味着double
将像52位整数一样,直到你的值足够大,需要指数。即便如此,使用double
这将是一个糟糕的想法和滥用类型系统。
答案 1 :(得分:0)
我不使用postgresql但是在mysql中我使用BIGINT
根据postgresql data types,也为postgresql提供BIGINT。
答案 2 :(得分:0)
mu太短有一个很好的答案,我只想补充说,如果你想在表之间使用ID作为外键,那么你应该坚持他描述的BIGINT解决方案,而不是使用字符串。这就是我使用的,基本上:
示例:
create_table(:photos) do |t|
t.integer :fb_uid, :limit => 8 # Facebook ID of the photo record
t.integer :facebook_profile_uid, :limit => 8, :null => false # foreign key to user
# ...
end
create_table(:users) do |t|
t.integer :fb_uid, :limit => 8, :null => false # Facebook ID of the user record
t.integer :photos_count, :integer, :default => 0
# ...
end
class User < ActiveRecord::Base
has_many :photos, foreign_key: :facebook_profile_uid, primary_key: :fb_uid
# ...
end
class Photo < ActiveRecord::Base
belongs_to :facebook_profile, foreign_key: :facebook_profile_uid, primary_key: :fb_uid, :counter_cache => true
end