2015-10-27 2 views
0

У меня есть следующие три таблицыSQL таблицы и соотношение дизайн

  Deliveries 
DeliveryID A1  
-----------|----| 
1   | 01 |  
2   | 01 |  
3   | 02 | 

     JobLinks 
LinkID DeliveryID A1 JobID 
------|------------|-----|------| 
1  | Null  | 01 | 1 | 
2  | 3   | Null| 2 | 

      Jobs 
JobID 
-------| 
1  |  
2  |  

Таким образом, знания, полученные в том, что работы 1 для поставок 1 и 2, и Иов 2 для доставки 3.

запрос, который демонстрирует это,

SELECT Deliveries.DeliveryID, 
     Jobs.JobID 
FROM Deliveries 
     JOIN JobLinks 
      ON JobLinks.DeliveryID = Deliveries.DeliveryID 
      OR JobLinks.A1 = Deliveries.A1 
     JOIN Jobs 
      ON Jobs.JobID = JobLinks.JobID 

Это вернет каждую доставку и связанную с ним работу

DeliveryID JobID  
-----------|-----| 
1   | 1 |  
2   | 1 |  
3   | 2 | 

Проблема, которую я вижу, заключается в том, что Delivery.A1 не является уникальным полем. Его можно изменить после создания записи поставки. Это означало бы, что я буду потенциально обновлять таблицу JobLinks всякий раз, когда это поле будет изменено. Для меня это кажется плохим дизайном. Как я могу конструировать эти отношения, чтобы избежать этого?

+0

Вы можете поместить триггер на Поставки, чтобы в любое время A1 обновлялся в Поставок, он получает аналогичное обновление в JobLinks. –

+0

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

+0

Мне кажется, что таблица доставки может быть удалена, если delivery_id и A1 больше не могут быть опущены. Если в таблице поставок содержится больше информации (которая не видна), удалите поле A1 в таблице JobLinks и убедитесь, что значение delivery_id больше недействительно. Если A1 изменяется в любом случае, вам нужно только изменить его в одном месте. – CSS

ответ

1

Просто создать таблицу для A1 метаданных с и ID autonumeric

A1_ID A1_meta 
    1  01 
    2  02 

Тогда Deliveries и JobLinks будет Referece A1_ID, как внешнего ключа

Так вы меняете только A1_meta в одном месте

+0

Мне это нравится. Однако, что, если пользователь только хочет изменить A1 для одного из Поставок, не все из них с совпадением A1 – myacobucci

+0

A1_meta или A1_ID? Во всяком случае, вероятно, лучше спросить, как новый вопрос, потому что потребуется некоторые выборочные данные и желание. –

-1

К сожалению, я не знаю, каковы ваши потребности, но это определенно плохой дизайн.

+0

Если вы не знаете, как его решить, не отправляйте ответ, он просто загромождает пространство. – CSS

+0

Потому что это предупреждение! Иногда хорошо знать, что НЕ ДОЛЖНО ... – Marco