Является ли плохой практикой предоставление каждой другой таблице (избыточной) связи с таблицей Company для упрощения моих запросов sql?
Да, безусловно, поскольку это будет означать обновление каждого избыточного отношения при обновлении отношений клиента с компанией или раздела с компанией - и если вы пропустите какое-либо такое обновление, у вас теперь есть база данных, полнаяизбыточные данные.Это плохая денормализация.
Если вы хотите просто упростить ваш SQL, рассмотрите возможность использования представлений для "переноса" родительских данных.Вот мнение, которое тянет company_id в контракт путем объединения через клиента:
create view contract_customer as
select
a.*,
b.contract_id, b.company_id
from
contract a
join customer b on (a.customer_id = b.customer_id);
Это соединение простое, но зачем повторять его снова и снова?Запишите его один раз, а затем используйте представление в других запросах.
Многие (но не все) РСУБД могут даже оптимизировать объединение, если вы не добавили ни одного столбца от клиента в список выбора или где предложениезапрос, основанный на представлении, при условии, что вы делаете contract.customer_id с ограничением ссылочной целостности внешнего ключа для customer.customer_id.(При отсутствии такого ограничения объединение не может быть опущено, потому что тогда будет возможно существовать contract.customer_id, который не существует у клиента. Поскольку вы никогда не захотите , что вы добавите ограничение внешнего ключа.)
Использование представления позволяет достичь того, чего вы хотите, без затрат времени на обновление дочерних таблиц, без затрат пространства на расширение дочерних строк путем добавления избыточныхстолбец (и это действительно начинает иметь значение, когда у вас много строк, так как чем шире строка, тем меньше строк может поместиться в память одновременно), и что наиболее важно, без возможности несогласованности данных при обновлении родителя, но потомковнет.