powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Правильно реализовать уникальность
15 сообщений из 15, страница 1 из 1
Правильно реализовать уникальность
    #37090935
E-hauler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть 3 таблицы, последовательно связанные друг с другом. Table1->Table2->Table3.

Table1company_idcompany_name
Table2company_idoffice_id
Table3office_iddeal_num

company_id, company_id - автоинкремент
deal_num - строка

Надо, чтобы записи таблицы 3 были уникальны в рамках company_id. Как правильно поддерживать эту уникальность? Добавить в таблицу 3 поле company_id и создать уникальный ключ company_id, deal_num или же это будет избыточно и есть более правильный способ?
...
Рейтинг: 0 / 0
Правильно реализовать уникальность
    #37090955
LSV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуйте применить триггеры.

зы: корявая структура
...
Рейтинг: 0 / 0
Правильно реализовать уникальность
    #37090956
E-hauler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
E-hauler,

поправлю office_id - автоинкремент
...
Рейтинг: 0 / 0
Правильно реализовать уникальность
    #37090958
E-hauler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LSV,

какую структуру посоветуете?
...
Рейтинг: 0 / 0
Правильно реализовать уникальность
    #37090977
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
table1 (company_id primary key...);

table2(company_id references table1, office_id ... primary key (company_id, office_id)...);

table3(company_id, office_id, foreign key (company_id, office_id) references table2, deal_num ... unuque (company_id, deal_num)...);
...
Рейтинг: 0 / 0
Правильно реализовать уникальность
    #37091021
E-hauler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mcureenab,

Это тот вариант, о котором я говорил. company_id будет и в table2 и в table3 - это вроде как "ненормально"
...
Рейтинг: 0 / 0
Правильно реализовать уникальность
    #37091249
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
E-haulerНадо, чтобы записи таблицы 3 были уникальны в рамках company_id.
Если я правильно понял структуру данных, то это развязка многие ко многим между company и office. Если так, то поле deal_num и ограничение на него представляются довольно странными, но делается только триггерами/хранимками и в общем плохо.

Если же многие ко многим тут не предусматривается, то надо просто убрать лишнюю таблицу, и всё станет легко и просто.
...
Рейтинг: 0 / 0
Правильно реализовать уникальность
    #37091257
E-hauler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
softwarer,

У company и office связь один ко многим, но я не представляю как тут убрать лишнюю таблицу. Есть список компаний. Каждой компании соответствует список оффисов. Каждому оффису - список сделок. У каждой сделки свой чиферно-буквенный уникальный идентификатор. Какая именно из таблиц лишняя?
...
Рейтинг: 0 / 0
Правильно реализовать уникальность
    #37091340
andy.s
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
E-hauler,

авторНадо, чтобы записи таблицы 3 были уникальны в рамках company_id

А вот я эту фразу почему-то не понял. Что является первичным ключом в таблице сделок? И почему сделки должны быть уникальны в рамках компании, а не офиса?
...
Рейтинг: 0 / 0
Правильно реализовать уникальность
    #37091365
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
E-haulerКаждому оффису - список сделок.
Ага, понял. Тогда так: если пытаться решить задачу сегодняшним днём, то нужно делать сделку развязкой между офисом и компанией, то есть "структура с дублированием". Но с практической точки зрения стоит иметь в виду, что правила нумерации документов относятся к часто и непредсказуемо меняющейся части бизнес-логики, скажем, сугубо для примера, через несколько месяцев может появиться требование стартовать нумерацию с каждого года заново. Поэтому закладывать ограничение в структуру таблиц неоправданно. Вместо этого нужна хранимка вроде "создай очередной номер" или в крайнем случае "проверь введённый пользователем номер".
...
Рейтинг: 0 / 0
Правильно реализовать уникальность
    #37091371
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
E-haulermcureenab,

Это тот вариант, о котором я говорил. company_id будет и в table2 и в table3 - это вроде как "ненормально"

"ненормально" только потому, что "office_id - автоинкремент", а так - просто составной PK. Ограничения целостности не позволят создать неоднозначные или неполные данные.

С триггером можно так поступить.

создаём индексную таблицу:

table4 (company_id, deal_num, primary key (company_id, deal_num));

и триггер на Table3. тоторый по старому/новому office_id находит из Table2 company_id и удаляет старый и/или добавляет новый ключ в table4.


Ещё так.

Table3 (company_id, deal_num, primary key (company_id, deal_num), office_id, foreign key (company_id, office_id) references table2);

Т.е. сделки регистрируются в рамках компании, а офис - доп. атрибут.
...
Рейтинг: 0 / 0
Правильно реализовать уникальность
    #37091373
Фотография Павел Воронцов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
E-haulersoftwarer,

У company и office связь один ко многим, но я не представляю как тут убрать лишнюю таблицу. Есть список компаний. Каждой компании соответствует список оффисов. Каждому оффису - список сделок. У каждой сделки свой чиферно-буквенный уникальный идентификатор. Какая именно из таблиц лишняя?В таком случае полю compzny_id в таблице Table3 самое место. Это ведь компаия заключает сделки, а не офис , я правильно понял? Таким образом Добавить в таблицу 3 поле company_id и создать уникальный ключ company_id, deal_num и есть искомое решение.
...
Рейтинг: 0 / 0
Правильно реализовать уникальность
    #37091388
E-hauler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andy.sА вот я эту фразу почему-то не понял. Что является первичным ключом в таблице сделок? И почему сделки должны быть уникальны в рамках компании, а не офиса?

В этом то и вопрос. Что сделать первичным ключем? Если бы была сделка, но не было офиса, то первичным ключем был бы company_id, deal_num.
Сделки в рамках компании должны быть уникальны потому, что таковы бизнес требования.
...
Рейтинг: 0 / 0
Правильно реализовать уникальность
    #37091430
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
E-hauler,

значит первичный учёт сделок должен всетись в разрезе компании, а офис - дополнительный атрибут сделки, который впрочем может входить в альтернативный ключ, в силу уникальности.
...
Рейтинг: 0 / 0
Правильно реализовать уникальность
    #37091441
E-hauler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mcureenab,

Так и сделал, но стали терзать сомнения. Спасибо, что развеяли их.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Правильно реализовать уникальность
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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