У меня есть несколько связанных таблиц, которые имеют открытые и закрытые столбцы идентификаторов. Публичный идентификатор открыт для Интернета, закрытый идентификатор - нет.
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 = ?
)