![]() |
|
Модераторы: Akina |
![]()
|
|
| Irdis |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 108 Регистрация: 21.5.2008 Репутация: нет Всего: 1 |
Как реализовать отношение 1..0 к 1..0.
|
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 25 Всего: 454 |
Это ты сейчас с кем разговаривал?
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| Irdis |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 108 Регистрация: 21.5.2008 Репутация: нет Всего: 1 |
Видимо плохой вопрос? Есть таблицы A и B. Хочется следующее, допустим в B есть FK a_id (который может быть и NULL). Надо сделать так, что бы любые две записи в таблице B имели различные a_id(ну или NULL). Т.е. по записи в A я мог достать не более одной записи в B. И по записи в B я мог достать не более одной записи в А. |
|||
|
||||
| Gluttton |
|
|||
![]() Начинающий ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1170 Регистрация: 28.8.2008 Где: Феодосия Репутация: нет Всего: 54 |
Три таблицы: А (id_a), AB (id_a, id_b), B(id_b).
Два ограничения на внешние ключи: foreign key AB.id_a reference A.id_a, foreign key AB.id_b reference B.id_b. Два триггера срабатывающих при вставке или обновлении, которые проверяют наличие существующих значений/ Тогда запросы на выборку записей из таблицы B, которые соответстуют записи в таблице А, которе равно Х будут выглядеть так:
Аналогичный запрос для таблицы А будет выглядеть с точностью наоборот. -------------------- Слава Україні! |
|||
|
||||
| Zloxa |
|
|||
|
Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 10 Всего: 161 |
накинуть ограничение уникальности на b.a_id
ЧЕРЕЗ ТРИГГЕРЫ КОНТРОЛИРОВАТЬ ОГРАНИЧЕНИЕ ЦЕЛОСТНОСТИ - МОЖНО ТОЛЬКО В ОДНОПОЛЬЗОВАТЕЛЬСКОЙ СРЕДЕ! Особенно на версионнике. ты представь как это дожно работать, при конкурентых инсертах/делетах в режиме изоляции read commited. За блокировочники не поручусь, там - свои ньюансы. Я их на вскидку не могу смоделировать, очень уж давно имел с ними дела. Добавлено через 11 минут и 39 секунд блин, проверил на MS SQL 2000, он nullы счиатает как заначения и проверяет по ним уникальность господа, прошу помочь мне сделать правильное заключение, какое из утверждений истинно: 1) Особенностью оракла является то, что ограничение уникальности по null не проверяется 1) Особенностью MS является то, что ограничение уникальности по null проверяется -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка |
|||
|
||||
| Zloxa |
|
|||
|
Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 10 Всего: 161 |
блин, почему я не посмотрел название форума? от чегото был уверен, что мы в форуме "составление запросов", и платформа не указана. -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка |
|||
|
||||
| Gluttton |
|
||||
![]() Начинающий ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1170 Регистрация: 28.8.2008 Где: Феодосия Репутация: нет Всего: 54 |
Никогда не вникал (не было практической задачи) в блокировки и транзакции, но поскольку у меня сейчас стоит похожая задача в Firebird (а он версионник), то судя по всему пришло время. А как тогда быть?
Не совсем понял. -------------------- Слава Україні! |
||||
|
|||||
| Zloxa |
|
||||||
|
Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 10 Всего: 161 |
MS:
оракля:
PG:
А как оно на FB, My? Кто является исключением? -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка |
||||||
|
|||||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 25 Всего: 454 |
Это описано в документации на MS SQL. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| Gluttton |
|
|||
![]() Начинающий ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1170 Регистрация: 28.8.2008 Где: Феодосия Репутация: нет Всего: 54 |
Firebird:
-------------------- Слава Україні! |
|||
|
||||
| Zloxa |
|
|||
|
Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 10 Всего: 161 |
Искуственно раскидывать блокировки,избавляясь от конкурентности сериализуя транзакции, пытаясь избегать дедлоков. В общем весьма не тривиальная и не всегда в полной мере реализуемая задача. я в том нисколько не сомневаюсь. мне было интересно насколько такая практика общепринята и чья реализации скорее исключение из правила - ораклиная или ж MSSql'ная. -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка |
|||
|
||||
| Gluttton |
|
||||
![]() Начинающий ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1170 Регистрация: 28.8.2008 Где: Феодосия Репутация: нет Всего: 54 |
Zloxa, т.е. я так понимаю, что разработчики разных СУБД писали проверку по разному, одни так:
А другие вот так:
Это сообщение отредактировал(а) Gluttton - 27.9.2010, 12:14 -------------------- Слава Україні! |
||||
|
|||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 25 Всего: 454 |
По классике сравнение с null ВСЕГДА даёт false... Добавлено через 4 минуты и 46 секунд
Видимо, надо выяснять, как к этому делу относится SQL92 =) -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| Zloxa |
|
|||
|
Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 10 Всего: 161 |
если быть чуть точнее - то unknown, либо же компромиссное "не истина". потому как если мы сделаем чек констрейнт, который, как известно, срабатывает по false, он тоже не сработает на сравнении с null и, мне кажется, Gluttton, понимая это, очень даже изящно пошутил Я думаю тут ноги растут от того, что в ранних версиях sql сервера, Null трактовался совсем не по ансишному и троичная логика не была в нем реализована. Некросы это вроде как объясняли тем, что они прорелизились раньше стандарта. Рудименты этого решения, для обратной совместимости, тянутся и ныне. -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка |
|||
|
||||
| Gluttton |
|
|||
![]() Начинающий ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1170 Регистрация: 28.8.2008 Где: Феодосия Репутация: нет Всего: 54 |
Вот это да
Угу -------------------- Слава Україні! |
|||
|
||||
| Gluttton |
|
|||
![]() Начинающий ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1170 Регистрация: 28.8.2008 Где: Феодосия Репутация: нет Всего: 54 |
Zloxa, ну все-таки хотельсь бы получить решение поднятой в топике проблемы.
Прочитал пару раз, но знакомых слов так и не нашел -------------------- Слава Україні! |
|||
|
||||
| Irdis |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 108 Регистрация: 21.5.2008 Репутация: нет Всего: 1 |
Я решил проблему для приложения(которое использует БД) с помощь Entity Framework. Сделав в бд отношение 1 ко многим (а_id int NULL в таблице B). А на стороне приложения с помощью Entity Framework'a ограничил многих как 0..1.
Но понятно, что любое другое приложение может поломать логику работы с БД(да и руками можно за инсертить не валидные данные). И это вообще не решение.
+++ |
|||
|
||||
| Zloxa |
|
||||||
|
Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 10 Всего: 161 |
Я его не знаю. Я очень давно работал с MS SQL и плохо помню его особенности. Наверно таки придется в триггере проверять наличие повторяющихся значений. Но чего это будет стоить - я пока до конца не обмозговал. Я начал было на работе эксперементировать, но рабочий день внезапно кончился.. Тут не маловажный ньюанс, что триггер работает в режиме изоляции вызывающей транзакции, а потому надо обмозговать поведение всех вариаций. В режиме рид коммитед поиск повторяющихся значений должен бы встать на блокировке по конкурентой записи. Мне кажется тут могут случаться дедлоки. В режиме грязных чтений, могут случаться фиктивные срабатывания ограничения - две сессии попытаются вставить одинаковые значения, и каждая получит отлуп. Обе эти жопы приводят к тому, что пишущие сессии получают не обоснованный отлуп, но нарушающего ограничения говна в базе не остается, что уже не плохо. Единственно - читающая грязными чтениями сессия может захватить ненароком данные, которые будут откатаны. Но это обычный риск гразных чтений.
наверное это имеет смысл делать в отдельной теме, да на конкретном примере. Потому как то, о чем я говорил характерно таки для версионников. Версионники не блокируют чтение, потому проверка в триггере на наличие дубликатов, в случае если есть незакомиченные другой транзакцией данные не даст фейла. например
В результате имеем две единицы в табличке, наше ограничение не работает. Блокировочник, в режиме read commited, на шаге 4 должен бы встать на блокировке, потому как есть незакоммиченный инсерт этого значения. На версионнике блокировок по чтению не бывает, их придется колдовать. В окакле для этих целей есть select... for update, в FB, тоже должно быть чтото вроде. Начнешь колдовать блокировки - надо будет както разруливать ситуацию последовательного их захвата, чтобы избегать взаимоблокировок процессов(дедлоков). на данном примере сложно показать, так как тут ребуется захват лишь одного ресурса (таблицы) и вообще, для FB, и Oracle эта задача интереса не представляет.. я ж грю это вопрос для отдльной темы. Это сообщение отредактировал(а) Zloxa - 27.9.2010, 23:33 -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка |
||||||
|
|||||||
| Gluttton |
|
|||
![]() Начинающий ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1170 Регистрация: 28.8.2008 Где: Феодосия Репутация: нет Всего: 54 |
-------------------- Слава Україні! |
|||
|
||||
![]()
|
| Правила форума "MS SQL" | |
|
|
Запрещается! Публиковать ссылки и обсуждать взлом чего бы то ни было.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, Akina. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | MS SQL Server | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |