Какой тип данных использовать для идентификатора пользователя Facebook в Rails и PostgreSQL - PullRequest
2 голосов
/ 14 декабря 2011

У меня есть база данных PostgreSQL для приложения Rails.

Я хочу сохранить идентификатор пользователя Facebook, чтобы подумать, что могу использовать целое число, но его недостаточно, поэтому я выбрал float.

Однако теперь Rails добавляет .0 к концу моего идентификатора пользователя

Какой тип данных я могу использовать, чтобы этого не происходило с очень длинными идентификаторами пользователей Facebook example: 100002496803785

Ответы [ 3 ]

7 голосов
/ 14 декабря 2011

Вы можете использовать :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)

А вот и ваш восьмибайтовый bigint столбец.

Вы также можете использовать строку для идентификатора Facebook. Вы не выполняете никаких арифметических операций с идентификаторами, поэтому они на самом деле являются просто непрозрачными пакетами битов, которые выглядят как большие целые числа, строки сортируются и сравниваются очень хорошо, поэтому они могут быть лучшим вариантом. Из-за увеличенного размера строки по сравнению с целым числом могут возникнуть некоторые проблемы с хранением и доступом, но, вероятно, этого будет недостаточно, чтобы внести какие-либо заметные изменения.

Никогда не используйте double для чего-то, что должно быть точным. В этом случае, вероятно, все будет в порядке (за исключением, конечно, конечного .0), поскольку у вас будет 52 бита мантиссы, а это означает, что double будет действовать как 52-битное целое число, пока ваши значения не станут достаточно большими требовать показателя. Тем не менее, использование double для этого было бы ужасной идеей и злоупотреблением системой типов.

0 голосов
/ 20 февраля 2013

мю слишком коротко, есть отличный ответ, я только хочу добавить, что если вы хотите использовать идентификатор в качестве внешнего ключа между таблицами, вам следует придерживаться решения 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
0 голосов
/ 14 декабря 2011

Я не использую postgresql, но в MySQL я использую BIGINT

Согласно postgresql типам данных , BIGINT для postgresql также.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...