2016-06-02 5 views
1

У меня есть таблица под названием inventory_movements, и я планирую сохранить движение продукции внутри и вне склада, он имеет такие поля, какКак я могу ограничить отношение внешнего ключа, где он может ссылаться на несколько других таблиц?

1- movement_id(PK) 
2- product_id(FK) 
3- quantity int 
4- unit_price decimal 
5- movement ENUM('in','out') 
6- date datetime 
7- ????????? (reference)(e.g. sell(out)- purchase(in)- fire loss(out) 
- sales return (in) - purchase return (out) 

Моя проблема заключается в том, что я хочу, чтобы сохранить ссылку движения (причина движения), где находится идентификатор заказа, или идентификатор покупки, идентификатор возврата покупки, .... и т. д.

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

очень плохое решение состоит в том, чтобы добавить столбец для каждого ссылочного типа (идентификатор продажи, идентификатор покупки, идентификатор продажи и т. Д.) И заполнить правильный номер в каждом движении, а остальные - недействительными, но это проклятие против нормализация, и я не могу добавить больше ссылок позже.

Что делать в этой ситуации?

пожалуйста, считают, что я очень новичок, благодаря

+1

вы либо имеете ссылочную целостность в столбце # 7, либо нет. В вашем текущем черновике вы не будете – Drew

+0

@Drew Нет, у меня нет ссылочной целостности, счета-фактуры на продажу имеют разную сериализацию, чем покупки, чем возврат, ... и т. Д. (Что означает, что у меня может быть счет-фактура покупки и счет-фактура продаж ** с таким же идентификационным номером **. В этом случае у меня есть какой-либо способ сделать ограничение внешнего ключа в столбце 7, поэтому я не получаю ссылку, которая не существует в системе (либо счет-фактура продажи или счет-фактура покупки)? –

+1

вы можете использовать NULL, и, как правило, он нахмурился как нарушение чувствительности, но обход. Если вы хотите, чтобы я дал полный ответ, я буду, но это сводится к это для того, как бы я это сделал: каждый тип транзакции имел бы свою собственную выделенную таблицу.Он бы поддерживал полную ссылочную целостность.И использование «союза» могло бы обеспечить хронологическое представление вещей – Drew

ответ

1

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

Другой подход заключается в том, чтобы разделить общие части ссылочных таблиц на одну, легко ссылочную таблицу. Если вы не можете этого сделать, вместо этого вы можете использовать таблицу, поддерживающую триггер. Это означало бы, что-то вроде:

  1. приводится таблица транзакций документов
  2. таблицы для продажи/данные о покупке (или, возможно, различные таблицы для этого).

Если это невозможно, у вас есть другая таблица, в которой хранятся только идентификаторы, соответствующие таблицы и идентификатор для ссылочной цели, и это поддерживается с помощью триггера, тогда у вас есть ссылочное ограничение.

В любом случае, в долгосрочной перспективе вы, вероятно, закончите со вторым решением (основной журнал транзакций, а затем другие таблицы, которые его расширят).

(Оригинальный дизайн вопрос ответить ниже.

В зависимости от того, как вы хотите, чтобы решить эту проблему, я могу увидеть один из двух способов сделать это.

Первый заключается в использовании основной конвенции положительных чисел приходя (покупка и продажа), но она ломается для локальных движений (перемещение между складами).

Один из вариантов заключается в том, чтобы иметь отдельную таблицу состояний, которая представляет собой глобальную и местных штатах. Например, покупки, продажи, разные склады и т. д. Затем вы представить передачу как графическую связь между состоянием. Вы также можете иметь таблицу документов, которая может представлять покупки и продажи, с соответствующими классификациями и т. Д. Это позволяет трехстороннюю связь между внутренним, внешними и документами.Например, продажа может иметь состояние в качестве инвентаря (или определенного склада), состояние продажи и документ торгового счета.

Конечно, вы можете сделать то и другое, сохраняя глобальный инвентарь в одном направлении и перемещая склад в другом.

+0

Большое вам спасибо за ваше время, которое поможет мне, когда я сделаю большую базу данных с большим количеством внутренних складов. но моя проблема заключается не в обработке промежуточных движений **, я только хочу сделать ограничение внешнего ключа в ссылочном столбце **, поэтому я не получаю ссылку, которая не существует ни в счетах-фактурах продаж, ни в счете-фактуре покупок , ..etc –

+0

Спасибо. Будет соответствующим образом изменен ответ –

+0

. Я также отредактировал вопрос, чтобы сделать его более ясным. Надеюсь, это поможет. –

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

  • Нет связанных вопросов^_^