Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Уникальность в нестандартной ситуации  [new]
Alex2001
Member

Откуда:
Сообщений: 188
Добрый день!
В базе необходимо хранить версии продуктов, которые состоят из набора UPC. Поскольку каждый UPC обладает довольно сложным составом, объемом, а меняются они не очень часто сейчас реализована схема с тремя таблицами - продукты, UPC и связь много ко многим, т.е. в случае когда UPC не меняется, в новую версию продукта добавляется просто новая ссылка на старый. При этом требуется, чтобы одному продукту(версии) соответствовали upc с разным полем num. Сейчас проверка реализована только в приложении. Какие есть варианты реализовать данное ограничение в БД? Спасибо заранее!
CREATE TABLE products
(
    object_id           VARCHAR(255) PRIMARY KEY,
    version               INTEGER NOT NULL
);
CREATE TABLE product_upcs
(
    object_id            VARCHAR(255) PRIMARY KEY,
    upc_object_id     VARCHAR(255),
    product_id          VARCHAR(255)
);
CREATE TABLE upcs
(
    object_id            VARCHAR(255) PRIMARY KEY,
    num                   INTEGER NOT NULL
6 апр 21, 12:19    [22304983]     Ответить | Цитировать Сообщить модератору
 Re: Уникальность в нестандартной ситуации  [new]
crutchmaster
Member

Откуда: оттуда.
Сообщений: 2235
Alex2001
object_id

object_ - не нужен, сбивает с толку.

Alex2001
Какие есть варианты реализовать данное ограничение в БД?

Триггеры на product_upcs, которые будут делать запрос с группировкой на каждую вставку/апдейтКартинка с другого сайта.
6 апр 21, 12:53    [22305010]     Ответить | Цитировать Сообщить модератору
 Re: Уникальность в нестандартной ситуации  [new]
Правильный Вася
Member

Откуда:
Сообщений: 410
object_id в таблице product_upcs и правда лишнее. Никакой полезной нагрузки не несёт.
(Кстати, называть разные сущности одинаковыми именами не только моветон, но и просто странно - фиг разберёшься...)

Сама задача не очень понятна по описанию.
Но если в кросс-таблице не нужны дубли (а это обычная практика), достаточно поставить UNIQUE CONSTRAINT сразу на 2 поля.
6 апр 21, 20:10    [22305186]     Ответить | Цитировать Сообщить модератору
 Re: Уникальность в нестандартной ситуации  [new]
crutchmaster
Member

Откуда: оттуда.
Сообщений: 2235
Правильный Вася,

Есть таблица А с (id, n) и таблица Б с (id, group_id, a_id). Надо чтобы в рамках одной group_id не было записей из A с одинаковым n.
7 апр 21, 03:44    [22305237]     Ответить | Цитировать Сообщить модератору
 Re: Уникальность в нестандартной ситуации  [new]
Правильный Вася
Member

Откуда:
Сообщений: 410
Значит, UNIQUE на 2 поля, как я и говорил.
7 апр 21, 15:57    [22305488]     Ответить | Цитировать Сообщить модератору
 Re: Уникальность в нестандартной ситуации  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18794
Правильный Вася
Значит, UNIQUE на 2 поля, как я и говорил.

Маловато.
Либо PK на два поля, либо UK на них же +not null на каждое из
7 апр 21, 17:23    [22305562]     Ответить | Цитировать Сообщить модератору
 Re: Уникальность в нестандартной ситуации  [new]
Правильный Вася
Member

Откуда:
Сообщений: 410
andrey_anonymous,
сильно зависит от предметной области.
Может, там допускаются null в каких-то случаях. Может, только на одно поле.
7 апр 21, 18:03    [22305598]     Ответить | Цитировать Сообщить модератору
 Re: Уникальность в нестандартной ситуации  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18794
Правильный Вася
andrey_anonymous,
сильно зависит от предметной области.

UK+nullable позволяет дубли для записей, содержащих null в одном из компонентов ключа - в означенной предметной области это косяк.
7 апр 21, 18:08    [22305605]     Ответить | Цитировать Сообщить модератору
 Re: Уникальность в нестандартной ситуации  [new]
Правильный Вася
Member

Откуда:
Сообщений: 410
andrey_anonymous,
это не есть правда.
Цитирую мануал:
To satisfy a composite unique key, no two rows in the table or view can have the same combination of values in the key columns.
Any row that contains nulls in all key columns automatically satisfies the constraint.
However, two rows that contain nulls for one or more key columns and the same combination of values for the other key columns violate the constraint.
8 апр 21, 01:18    [22305752]     Ответить | Цитировать Сообщить модератору
 Re: Уникальность в нестандартной ситуации  [new]
crutchmaster
Member

Откуда: оттуда.
Сообщений: 2235
Правильный Вася
Значит, UNIQUE на 2 поля, как я и говорил.

На какие? A.n и Б.group_id ? А так можно?
8 апр 21, 12:01    [22305883]     Ответить | Цитировать Сообщить модератору
 Re: Уникальность в нестандартной ситуации  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10153
crutchmaster
Правильный Вася
Значит, UNIQUE на 2 поля, как я и говорил.

На какие? A.n и Б.group_id ? А так можно?


Только добавив N в Б + PK(ID) и UK(ID,N) в A + FK(ID,N) и UK(GROUP_ID,N) в Б

SY.

Сообщение было отредактировано: 8 апр 21, 13:30
8 апр 21, 13:35    [22305945]     Ответить | Цитировать Сообщить модератору
 Re: Уникальность в нестандартной ситуации  [new]
delphinotes
Member

Откуда: Санкт-Петербург
Сообщений: 378
Если уникальность нужно "собрать" из нескольких таблиц, можно использовать мат.представление с fast refresh on commit и уникальным индексом.
Как плюс - не надо модифицировать таблицы, делать триггеры, или как-то по другому обновлять поле.
Как минус - уникальность будет проверяться на коммите (а не в момент insert или update), это может быть критичным.
9 апр 21, 00:31    [22306234]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить