Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Как выразить это констреинтом ?  [new]
TsHeloWorlder
Member

Откуда:
Сообщений: 139
Есть такая таблица

id fk DateStart Name GroupId
1 1 01.01.2010 10.30 "Test1" 1
2 1 01.01.2010 12.30 "Test2" 1
3 2 01.01.2010 15.30 "Test1" 1


Т.е. у FK=1 с 10.30 до 12.30 было имя Test1. Но с 15.30 это имя было отдано FK2.

Нужно обеспечить, чтобы в одном периоде времени в одной группе не могло быть несколько сущностей (fk) с одинаковым именем.Как это обеспечить ?
Вопрос посложнее. Можно ли это обеспечить через Entity Framework ?
5 сен 17, 15:32    [20773187]     Ответить | Цитировать Сообщить модератору
 Re: Как выразить это констреинтом ?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
TsHeloWorlder,

написать дурацкую функцию для дурацкого констрйнта
5 сен 17, 15:34    [20773204]     Ответить | Цитировать Сообщить модератору
 Re: Как выразить это констреинтом ?  [new]
waszkiewicz
Member

Откуда:
Сообщений: 1067
TsHeloWorlder,

"кто на ком стоял?" (c)
5 сен 17, 15:38    [20773232]     Ответить | Цитировать Сообщить модератору
 Re: Как выразить это констреинтом ?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7383
Entity Framework здесь каким боком? Это же клиент.
5 сен 17, 15:40    [20773250]     Ответить | Цитировать Сообщить модератору
 Re: Как выразить это констреинтом ?  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20174
На показанных данных представим, что нужно добавить две записи, где FK=3 в 13:30 получает имя Test1, а в 14:30 меняет его на Test3. В указанном порядке добавить записи нельзя - описанный констрейнт не позволит иметь имя Test1 двум FK (2 и 3) после добавления первой записи, но до добавления второй, в то время как в обратном порядке записи добавятся без проблем.

Вывод прост - ошибка проектирования.
5 сен 17, 15:42    [20773265]     Ответить | Цитировать Сообщить модератору
 Re: Как выразить это констреинтом ?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7383
TsHeloWorlder,

создайте уникальный индекс по fk, name, groupid.
5 сен 17, 15:43    [20773276]     Ответить | Цитировать Сообщить модератору
 Re: Как выразить это констреинтом ?  [new]
TsHeloWorlder
Member

Откуда:
Сообщений: 139
Владислав Колосов
TsHeloWorlder,

создайте уникальный индекс по fk, name, groupid.


но тогда это не позволит менять имя в течении дня же.
5 сен 17, 15:53    [20773324]     Ответить | Цитировать Сообщить модератору
 Re: Как выразить это констреинтом ?  [new]
TsHeloWorlder
Member

Откуда:
Сообщений: 139
Akina
На показанных данных представим, что нужно добавить две записи, где FK=3 в 13:30 получает имя Test1, а в 14:30 меняет его на Test3. В указанном порядке добавить записи нельзя - описанный констрейнт не позволит иметь имя Test1 двум FK (2 и 3) после добавления первой записи, но до добавления второй, в то время как в обратном порядке записи добавятся без проблем.

Вывод прост - ошибка проектирования.


Нет, все верно. При попытке добавить FK=3 с именем Test1 юзер увидит ошибку "такое имя уже есть". И поймет, что нужно сначала "освободить" имя Test1. Если же он не знает, что имя Test1 будет освобождено второй вставкой (например другим юзером) то у него самого должен возникнуть вопрос "как это у меня будет 2 предмета с одним именем ? Что-то не так, нужно разобратся", после чего узнает у коллег, что Test1 планируется освобождать и сделает это сам, либо подождет когда сделает коллега.

В общем я не вижу проблемы. Юзеры не тупы, и сами поймут что к чему по этим ошибкам. Ибо им и самим очевидно, что не может быть 2 предмета с идентичным именем в одном отрезке времени. А программа же защитит их от глупых ошибок, которые сломают отчетную систему - им же от этого будет хуже, так, что такая защита для них и делается.
5 сен 17, 16:00    [20773357]     Ответить | Цитировать Сообщить модератору
 Re: Как выразить это констреинтом ?  [new]
TsHeloWorlder
Member

Откуда:
Сообщений: 139
Владислав Колосов
Entity Framework здесь каким боком? Это же клиент.


Ну так, если Code First подход, то как-то же нужно это ограничение в базу пропихнуть - через EF. Чтобы все было сохранено в миграциях и воспроизводилось у других разработчиков (в их локальной БД).
5 сен 17, 16:02    [20773368]     Ответить | Цитировать Сообщить модератору
 Re: Как выразить это констреинтом ?  [new]
iap
Member

Откуда: Москва
Сообщений: 46951
Я такое делал в триггере.
5 сен 17, 16:03    [20773371]     Ответить | Цитировать Сообщить модератору
 Re: Как выразить это констреинтом ?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
iap
Я такое делал в триггере.

поддержу, если нужна бизнес логика констрейна, то instead of trigger
5 сен 17, 16:29    [20773451]     Ответить | Цитировать Сообщить модератору
 Re: Как выразить это констреинтом ?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7383
TsHeloWorlder
Владислав Колосов
TsHeloWorlder,

создайте уникальный индекс по fk, name, groupid.


но тогда это не позволит менять имя в течении дня же.


Почему? Имя же входит. Уникальность не будет нарушена.
6 сен 17, 11:39    [20774977]     Ответить | Цитировать Сообщить модератору
 Re: Как выразить это констреинтом ?  [new]
dies irae
Member

Откуда:
Сообщений: 78
TaPaK
поддержу, если нужна бизнес логика констрейна, то instead of trigger


только не instead of, а обычный триггер
6 сен 17, 12:02    [20775102]     Ответить | Цитировать Сообщить модератору
 Re: Как выразить это констреинтом ?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
dies irae
TaPaK
поддержу, если нужна бизнес логика констрейна, то instead of trigger


только не instead of, а обычный триггер

сначало вставить, потом исправлять и откатывать? выйди из класса
6 сен 17, 12:03    [20775115]     Ответить | Цитировать Сообщить модератору
 Re: Как выразить это констреинтом ?  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20174
TsHeloWorlder
Юзеры не тупы

Весьма распространённое заблуждение.

Не понимаю, почему используется именно хранение даты факта изменения, а не диапазона начало-конец для значения. Для открытой даты завершения при этом можно использовать дату в далёком будущем (скажем, максимально допустимое значение) либо специальное значение (например, Null). А клиентская часть при обнаружении интерференции может не только сообщить об этом, но и указать, с какой записью пересечение (это будет чуть проще, чем в текущей структуре), и даже выполнить по запросу оператора необходимую корректировку (скажем, закрытие интерферирующей записи с открытой датой) автоматически...
6 сен 17, 12:33    [20775213]     Ответить | Цитировать Сообщить модератору
 Re: Как выразить это констреинтом ?  [new]
LSV
Member [заблокирован]

Откуда: Киев
Сообщений: 30817
Не понимаю, почему используется именно хранение даты факта изменения, а не диапазона начало-конец для значения
Дата закрытия нужна только в случае, когда сущность может иметь период неактуальности (старый период закончился, новый еще не наступил). В других случаях достаточно одной даты.
6 сен 17, 14:42    [20775756]     Ответить | Цитировать Сообщить модератору
 Re: Как выразить это констреинтом ?  [new]
iap
Member

Откуда: Москва
Сообщений: 46951
LSV
Не понимаю, почему используется именно хранение даты факта изменения, а не диапазона начало-конец для значения
Дата закрытия нужна только в случае, когда сущность может иметь период неактуальности (старый период закончился, новый еще не наступил). В других случаях достаточно одной даты.
Запросы получаются проще, если обе даты на одной строке.
6 сен 17, 14:48    [20775792]     Ответить | Цитировать Сообщить модератору
 Re: Как выразить это констреинтом ?  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20174
LSV
Дата закрытия нужна только в случае, когда сущность может иметь период неактуальности (старый период закончился, новый еще не наступил). В других случаях достаточно одной даты.

Можно, я переформулирую? "Некоторые сущности требуют одной даты, некоторые - двух дат."

А вот теперь скажи - почему структура данных не предусматривает нормального хранения ЛЮБОЙ из этих двух категорий.
6 сен 17, 15:03    [20775847]     Ответить | Цитировать Сообщить модератору
 Re: Как выразить это констреинтом ?  [new]
LSV
Member [заблокирован]

Откуда: Киев
Сообщений: 30817
Akina
А вот теперь скажи - почему структура данных не предусматривает нормального хранения ЛЮБОЙ из этих двух категорий.
Это ко мне вопрос ??? :)

У меня не было ситуации "неактуально". Поэтому обычно применяю одну дату.
Но представляю ситуацию, когда нужны две, н-р срок действия договора.
6 сен 17, 16:24    [20776103]     Ответить | Цитировать Сообщить модератору
 Re: Как выразить это констреинтом ?  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20174
LSV
Это ко мне вопрос ???
Конечно. И он не о датах, а о том, как можно допускать структуру, которая описывает только половину предметной области? С учётом того, для какого исходного вопроса помещён тут твой комментарий...
6 сен 17, 20:40    [20776714]     Ответить | Цитировать Сообщить модератору
 Re: Как выразить это констреинтом ?  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
TaPaK
dies irae
пропущено...


только не instead of, а обычный триггер

сначало вставить, потом исправлять и откатывать? выйди из класса
Товарищ очень любит instead of триггера, наверное на каждой таблице по повесил, да?
6 сен 17, 22:35    [20776863]     Ответить | Цитировать Сообщить модератору
 Re: Как выразить это констреинтом ?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Mind
TaPaK
пропущено...

сначало вставить, потом исправлять и откатывать? выйди из класса
Товарищ очень любит instead of триггера, наверное на каждой таблице по повесил, да?

тотварища тошнит от идиотизма
7 сен 17, 09:21    [20777312]     Ответить | Цитировать Сообщить модератору
 Re: Как выразить это констреинтом ?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3436
TsHeloWorlder
Есть такая таблица

id fk DateStart Name GroupId
1 1 01.01.2010 10.30 "Test1" 1
2 1 01.01.2010 12.30 "Test2" 1
3 2 01.01.2010 15.30 "Test1" 1


Т.е. у FK=1 с 10.30 до 12.30 было имя Test1. Но с 15.30 это имя было отдано FK2.

Нужно обеспечить, чтобы в одном периоде времени в одной группе не могло быть несколько сущностей (fk) с одинаковым именем.Как это обеспечить ?
Вопрос посложнее. Можно ли это обеспечить через Entity Framework ?


Entity Framework - зло, кроме того, оно не пишет запросы, оно не умное.
7 сен 17, 10:19    [20777523]     Ответить | Цитировать Сообщить модератору
 Re: Как выразить это констреинтом ?  [new]
dies irae
Member

Откуда:
Сообщений: 78
TaPaK
dies irae
пропущено...


только не instead of, а обычный триггер

сначало вставить, потом исправлять и откатывать? выйди из класса


сходи в школу для начала.
откатов гораздо меньше, чем успешных вставок, а instead триггера кроме присущих им ограничений ещё и медленнее
7 сен 17, 10:30    [20777589]     Ответить | Цитировать Сообщить модератору
 Re: Как выразить это констреинтом ?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
dies irae
TaPaK
пропущено...

сначало вставить, потом исправлять и откатывать? выйди из класса


сходи в школу для начала.
откатов гораздо меньше, чем успешных вставок, а instead триггера кроме присущих им ограничений ещё и медленнее

да откуда ж вы лезете то?
7 сен 17, 10:37    [20777630]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить