Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Уникальность в нестандартной ситуации / 12 сообщений из 12, страница 1 из 1
06.04.2021, 12:19
    #40060106
Alex2001
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальность в нестандартной ситуации
Добрый день!
В базе необходимо хранить версии продуктов, которые состоят из набора UPC. Поскольку каждый UPC обладает довольно сложным составом, объемом, а меняются они не очень часто сейчас реализована схема с тремя таблицами - продукты, UPC и связь много ко многим, т.е. в случае когда UPC не меняется, в новую версию продукта добавляется просто новая ссылка на старый. При этом требуется, чтобы одному продукту(версии) соответствовали upc с разным полем num. Сейчас проверка реализована только в приложении. Какие есть варианты реализовать данное ограничение в БД? Спасибо заранее!
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
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
...
Рейтинг: 0 / 0
06.04.2021, 12:53
    #40060125
crutchmaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальность в нестандартной ситуации
Alex2001
object_id

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

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

Триггеры на product_upcs, которые будут делать запрос с группировкой на каждую вставку/апдейт
...
Рейтинг: 0 / 0
06.04.2021, 20:10
    #40060217
Правильный Вася
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальность в нестандартной ситуации
object_id в таблице product_upcs и правда лишнее. Никакой полезной нагрузки не несёт.
(Кстати, называть разные сущности одинаковыми именами не только моветон, но и просто странно - фиг разберёшься...)

Сама задача не очень понятна по описанию.
Но если в кросс-таблице не нужны дубли (а это обычная практика), достаточно поставить UNIQUE CONSTRAINT сразу на 2 поля.
...
Рейтинг: 0 / 0
07.04.2021, 03:44
    #40060250
crutchmaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальность в нестандартной ситуации
Правильный Вася,

Есть таблица А с (id, n) и таблица Б с (id, group_id, a_id). Надо чтобы в рамках одной group_id не было записей из A с одинаковым n.
...
Рейтинг: 0 / 0
07.04.2021, 15:57
    #40060411
Правильный Вася
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальность в нестандартной ситуации
Значит, UNIQUE на 2 поля, как я и говорил.
...
Рейтинг: 0 / 0
07.04.2021, 17:23
    #40060462
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальность в нестандартной ситуации
Правильный Вася
Значит, UNIQUE на 2 поля, как я и говорил.

Маловато.
Либо PK на два поля, либо UK на них же +not null на каждое из
...
Рейтинг: 0 / 0
07.04.2021, 18:03
    #40060479
Правильный Вася
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальность в нестандартной ситуации
andrey_anonymous,
сильно зависит от предметной области.
Может, там допускаются null в каких-то случаях. Может, только на одно поле.
...
Рейтинг: 0 / 0
07.04.2021, 18:08
    #40060486
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальность в нестандартной ситуации
Правильный Вася
andrey_anonymous,
сильно зависит от предметной области.

UK+nullable позволяет дубли для записей, содержащих null в одном из компонентов ключа - в означенной предметной области это косяк.
...
Рейтинг: 0 / 0
08.04.2021, 01:18
    #40060560
Правильный Вася
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальность в нестандартной ситуации
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 .
...
Рейтинг: 0 / 0
08.04.2021, 12:01
    #40060642
crutchmaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальность в нестандартной ситуации
Правильный Вася
Значит, UNIQUE на 2 поля, как я и говорил.

На какие? A.n и Б.group_id ? А так можно?
...
Рейтинг: 0 / 0
08.04.2021, 13:35
    #40060683
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальность в нестандартной ситуации
crutchmaster
Правильный Вася
Значит, UNIQUE на 2 поля, как я и говорил.

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


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

SY.
...
Рейтинг: 0 / 0
09.04.2021, 00:31
    #40060862
delphinotes
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальность в нестандартной ситуации
Если уникальность нужно "собрать" из нескольких таблиц, можно использовать мат.представление с fast refresh on commit и уникальным индексом.
Как плюс - не надо модифицировать таблицы, делать триггеры, или как-то по другому обновлять поле.
Как минус - уникальность будет проверяться на коммите (а не в момент insert или update), это может быть критичным.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Уникальность в нестандартной ситуации / 12 сообщений из 12, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]