在Rails和PostgreSQL中用于Facebook用户ID的数据类型

时间:2011-12-14 10:36:34

标签: ruby-on-rails facebook postgresql types

我有一个用于Rails应用程序的PostgreSQL数据库。

我想存储Facebook用户ID,所以我认为我可以使用整数,但它不够大,所以我选择了浮动。

但是现在Rails将.0添加到我的用户ID

的末尾

我可以使用哪种数据类型,因此对于篇幅很长的Facebook用户ID不会发生这种情况example: 100002496803785

3 个答案:

答案 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