2017-01-30 2 views
-2

Я разрабатываю приложение для составления котировок. Сначала вы делаете расщепление (или расчет), и после этого вы добавляете элемент в цитату. Проблема в том, что у меня есть много продуктов, поэтому каждая категория продукта будет иметь свою собственную разбивку стоимости с различными параметрами, которые нужно заполнить. Если у меня будет только одна таблица для разбивки затрат, тогда она будет огромной (много полей в таблице). У меня такое чувство, что это неправильный подход. Поэтому я придумал диаграмму ниже:Подключение одного внешнего ключа к нескольким таблицам (первичные ключи)

My diagram

Является ли это решение даже возможно, или я должен иметь «N» (если у меня есть N-таблица) различные FK для каждой стоимости ломаются таблицами? Есть ли у вас лучшие решения?

У меня есть другой вопрос, если мне нужен ссылочный стол «Quotation_QtnDetail»?

+0

Используйте другую таблицу с соотношением 1-1 для всех таблиц расчета. Используйте эту таблицу в качестве таблицы первичных ключей для вашего внешнего ключа. Легко подключить многие таблицы по соотношению 1-1, но не к 1-м отношениям. –

ответ

0

Можно было бы сохранить ссылку на конкретное значение в одной из этих таблиц, указав столбец CalculationType, указывающий, в какой таблице находится запись, а также столбец общего идентификационного идентификатора (содержащий идентификатор соответствующей записи) , Например, если вы сохраняли CalcId из 123 и CalculationType из 2, это указывало бы на запись с идентификатором 123 в таблице Calc2.

Недостатком этого является то, что вы потеряете способность проверять свои данные с помощью ограничений FK, а также сделает соединения с вашими таблицами вычислений немного более сложными.

Что касается таблицы Quotation_QtnDetail, за исключением случаев, когда запись QtnDetail может быть связана с несколькими Quotation записями, нет необходимости в этом дополнительном ссылочном столе. Вместо этого просто свяжите его напрямую, добавив столбец QtnId в таблицу QtnDetail. Аналогичным образом, вы также можете удалить таблицу Calc_QtnItm, если элемент связан только с одной записью.

+0

Спасибо. Я буду использовать ваше решение с CalculationType. Но как я могу управлять этим с помощью sql-запросов? Я использую оператор CASE? – Urban

+0

Зависит от того, что вам нужно сделать. Вы можете оставить все таблицы (например, LEFT JOIN Calc1 ON Calc1.CalLinkId = Calc_QtnItm.CalcId AND Calc_QtnItem.CalculationType = 1) и в конечном итоге выбрать много значений NULL, или просто вы можете просто сделать свое приложение отдельным запросом получить информацию о расчете из соответствующей таблицы (на основе Calc_QtnItem.CalculationType). – Sam

Смежные вопросы