Дизайн таблицы базы данных с открытым и закрытым идентификатором в Postgres - PullRequest
0 голосов
/ 12 мая 2018

У меня есть несколько связанных таблиц, которые имеют открытые и закрытые столбцы идентификаторов. Публичный идентификатор открыт для Интернета, закрытый идентификатор - нет.

CREATE TABLE cart (
  private_id SERIAL,
  public_id UUID default gen_random_uuid()
);

CREATE TABLE product(
  private_id SERIAL,
  public_id UUID default gen_random_uuid()
);

CREATE TABLE cart_item(
  private_id SERIAL,
  public_id UUID default gen_random_uuid(),
  cart_id INT references cart(private_id)
  product_id INT references product(private_id)
);

Проблема, с которой я столкнулся при описанном выше дизайне, заключается в том, что когда я запрашиваю только элементы корзины, мне нужно объединить элементы с корзиной и продуктом, чтобы получить их общедоступные идентификаторы.

SELECT p.public_id, c.public_id, ci.public_id 
FROM cart c JOIN cart_item ci ON c.private_id = ci.cart_id
JOIN product p ON ci.product_id = p.private_id

Как лучше всего разработать концепцию открытого / закрытого идентификатора и ограничить количество объединений, необходимых для получения открытых идентификаторов?

Один из способов упростить это - преобразовать закрытый идентификатор в UUID и раскрыть их - Том Харрисон-младший не одобряет.

Другим способом было бы денормализовать публичные идентификаторы наряду с частными - как мне синхронизировать частный идентификатор и открытый идентификатор?

Edit: Вставка данных в cart_item также проблематична. Частный идентификатор корзины и продукта должен быть разрешен с помощью открытого идентификатора (клиент имеет доступ только к общему идентификатору):

INSERT INTO cart_item(cart_id, product_id) VALUES (
  SELECT private_id FROM cart WHERE public_id = ?,
  SELECT private_id FROM product WHERE public_id = ?
)
...