2017-02-01 10 views
1

Я пытаюсь узнать postgres после работы с mongodb на некоторое время, и мне интересно, как иметь уникальный идентификатор для каждого comment.Использует SERIAL fine для первичного ключа при создании таблицы всех комментариев, сделанных пользователями?

У меня есть внешний ключ userId, для которого пользователь создал комментарий, но для первичного ключа мне нужен какой-то commentId. Хорошо ли использовать SERIAL для моих commentId? Или, есть ли лучший подход, такой как UUID? Я не знаю, придется ли мне когда-либо переносить данные.

+2

«uuid» и «SERIAL» могут использоваться в postgres. SERIAL создает последовательность и присваивает столбцу при создании таблицы –

+0

спасибо за объяснение! – user1354934

ответ

2

Поскольку фактическое значение идентификатора комментария не интересует вас (просто тот факт, что он есть и он уникален), serial - хороший выбор для такого столбца. Обратите внимание, что в современных PostgreSQL-базах данных (начиная с 7.3) создание serial автоматически не означает, что у него будет уникальное ограничение, поэтому вам придется обрабатывать это явно. Например .:

CREATE TABLE comments (
    comment_id SERIAL PRIMARY KEY, 
    user_id INT REFERENCES users(id), -- You should probably also index it 
    comment VARCHAR(200) -- Or any other reasonable size 
) 

EDIT:
Чтобы ответить на этот вопрос в комментариях, подобное поведение может быть создана для UUID колонки, придав ему значение по умолчанию для вновь создаваемого UUID.

Во-первых, вам нужно будет установить пакет postgres-contrib` (если он еще не установлен). Например, на дистрибутивы Linux на основе Red Hat, вы можете запустить (как корень):

$ dnf install postgresql-contrib 

Тогда из привилегированного пользователя, вам необходимо создать расширение:

CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; 

Это создаст generate_uuid_v1 функцию вы можете использовать:

CREATE TABLE comments (
    comment_id UUID DEFAULT UUID_GENERATE_V1() PRIMARY KEY, 
    user_id INT REFERENCES users(id), -- You should probably also index it 
    comment VARCHAR(200) -- Or any other reasonable size 
) 
+0

Спасибо! Есть ли встроенный способ сделать uuid аналогичным образом? – user1354934

+1

@ user1354934 Это немного clunkier, но конечно, это определенно выполнимо. См. Мой отредактированный ответ. – Mureinik

+0

wow благодарит много Mureinik! Я понимаю, что uuid, вероятно, медленнее, но я думаю, что это поможет при миграции в будущем, если это необходимо, не так ли? Спасибо – user1354934