Как зайти в Даркнет?!
25th January, 01:11
5
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
893
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
912
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4350
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
SQL2005: связывание таблицы с несколькими таблицами и сохранение целостности ссылок?
Вот упрощение моей базы данных:
Table: Property Fields: ID, Address Table: Quote Fields: ID, PropertyID, BespokeQuoteFields... Table: Job Fields: ID, PropertyID, BespokeJobFields...
Затем у нас есть другие таблицы, которые относятся к таблицам котировок и заданий по отдельности.
Теперь мне нужно добавить таблицу сообщений , где пользователи могут записывать телефонные сообщения, оставленные клиентами относительно заданий и котировок.
Я мог бы создать две идентичные таблицы (QuoteMessage и JobMessage), но это нарушает принцип DRY и кажется беспорядочным.
Я мог бы создать одну таблицу сообщений :
Table: Message Fields: ID, RelationID, RelationType, OtherFields...
Но это останавливает меня от использования ограничений для обеспечения моей ссылочной целостности. Я также могу предвидеть, что это создает проблемы со стороной devlopment, используя Linq для SQL позже.
Есть ли элегантное решение этой проблемы, или мне в конечном итоге придется взломать что-то вместе?
Ожоги
Создайте одну таблицу сообщений, содержащую уникальный MessageId и различные свойства, которые необходимо сохранить для сообщения.
Table: Message
Fields: Id, TimeReceived, MessageDetails, WhateverElse...
Создайте две таблицы ссылок-QuoteMessage и JobMessage. Они будут содержать только два поля, внешние ключи к цитате / заданию и сообщению.
Table: QuoteMessage
Fields: QuoteId, MessageId
Table: JobMessage
Fields: JobId, MessageId
Таким образом, вы определили свойства данных сообщения только в одном месте (что упрощает расширение и запрос по всем сообщениям), но у вас также есть ссылочная целостность, связывающая кавычки и задания с любым количеством сообщений. Действительно, и Цитата, И задание могут быть связаны с одним и тем же сообщением (я не уверен, подходит ли это для вашей бизнес-модели, но, по крайней мере, модель данных дает вам возможность).
О единственном другом способе, который я могу придумать, - это иметь базовую таблицу сообщений с идентификатором и TypeId. Ваши подтаблицы (QuoteMessage и JobMessage) затем ссылаются на базовую таблицу как на MessageId, так и на TypeId, но также имеют ограничения CHECK для них, чтобы применять только соответствующий MessageTypeId.
Table: Message
Fields: Id, MessageTypeId, Text, ...
Primary Key: Id, MessageTypeId
Unique: Id
Table: MessageType
Fields: Id, Name
Values: 1, "Quote" : 2, "Job"
Table: QuoteMessage
Fields: Id, MessageId, MessageTypeId, QuoteId
Constraints: MessageTypeId = 1
References: (MessageId, MessageTypeId) = (Message.Id, Message.MessageTypeId)
QuoteId = Quote.QuoteId
Table: JobMessage
Fields: Id, MessageId, MessageTypeId, JobId
Constraints: MessageTypeId = 2
References: (MessageId, MessageTypeId) = (Message.Id, Message.MessageTypeId)
JobId = Job.QuoteId
Что это дает вам, по сравнению с просто JobMesssage и QuoteMessage таблицы? Это повышает сообщение до гражданина первого класса, так что вы можете прочитать все сообщения из одной таблицы. В обмен на это ваш путь запроса от сообщения до соответствующей цитаты или задания составляет еще 1 соединение. Это зависит от вашего потока приложений, является ли это хорошим компромиссом или нет.
Что касается 2 одинаковых таблиц, нарушающих DRY - я бы не зацикливался на этом. В дизайне DB речь идет не столько о DRY,сколько о нормализации. Если две вещи, которые вы моделируете, имеют одинаковые атрибуты (столбцы), но на самом деле разные вещи (таблицы) - тогда разумно иметь несколько таблиц с похожими схемами. Гораздо лучше, чем наоборот жевать разные вещи вместе.
@burns
Ответ Яна (+1) верен [см. Примечание] . Использование таблицы "многие ко многим" QUOTEMESSAGE для соединения QUOTE с MESSAGE является наиболее правильной моделью, но оставит потерянными записи MESSAGE .
Это один из тех редких случаев, когда триггер может быть использован. Однако необходимо соблюдать осторожность, чтобы гарантировать, что запись a single MESSAGE не может быть связана как с A QUOTE , так и с A JOB .
create trigger quotemessage_trg
on quotemessage
for delete
as
begin
delete
from [message]
where [message].[msg_id] in
(select [msg_id] from Deleted);
end
Обратите внимание на Яна, Я думаю, что есть опечатка в определении таблицы для JobMessage, где столбцы должны быть JobId, MessageId (?). Я бы отредактировал вашу цитату, но мне может потребоваться несколько лет, чтобы получить такой уровень репутации!