2011-12-14 2 views
2

레일 애플리케이션 용 PostgreSQL 데이터베이스가 있습니다.Rails와 PostgreSQL에서 Facebook 사용자 ID에 사용할 데이터 유형

나는 정수를 사용할 수 있다고 생각 했으므로 페이스 북 사용자 ID를 저장하고 싶지만 너무 크지 않아서 float을 선택했다.

그러나 지금은 레일의 끝에 0.0을 추가 내 사용자 ID의 내가 PostgreSQL을 사용하지 않는 example: 100002496803785

답변

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을 사용하지 마십시오. 이 경우에는 아마 5232 비트의 가수가 있기 때문에 괜찮을 것입니다 (.0은 물론). double은 값이 지수를 필요로 할만큼 충분히 커질 때까지 52 비트 정수처럼 작동합니다. . 그렇다고해도 double을 사용하는 것은 끔찍한 생각이며 유형 시스템의 남용입니다.

+0

위대한 팁을 주셔서 감사 드리며 문자열로 전환합니다. – chell

0

매우 긴 페이스 북 사용자 ID에 대한 발생하지 않습니다 그래서이 사용할 수있는 어떤 데이터 타입

하지만 mysql에서 나는 BIGINT를 사용한다.

postgresql data types에 따르면, postgresql에도 BIGINT가 사용된다.

+0

그러나 레일이 큰 INT가 없습니다. – chell

+0

레일에 bignum이나 무언가가 있다고 생각 하나? – danielv

+0

@chell, postgres는 int8을 가지고 있기 때문에 postgres에 문제가 없으므로 레일에 문제가 있습니다. 질문에 제대로 태그를 답니다. – filiprem

0

뮤가 너무 짧다는 훌륭한 대답이 있습니다. 표를 외래 키로 사용하려는 경우 그 문자열을 사용하지 말고 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 
관련 문제