Отношения категории MS Visio с SQL Server - PullRequest
0 голосов
/ 20 января 2010

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

Существует ли конкретный способ реализации такого рода отношений в SQL Server, или это просто концептуальная модель, оставляющая реализацию до меня? Если последнее, зачем иметь столбец транзакции в родительской таблице, если все таблицы связаны с транзакцией транзакции - это просто сузить мои запросы? То есть, если в строке родительской таблицы указано «check» как тип транзакции, я знаю, что мне нужно только запросить / присоединиться к дочерней таблице check?

Это только что пришло мне в голову - это просто иерархия ISA, и в этом случае я бы создал три отдельные таблицы, каждая из которых содержит столбцы, идентифицированные в родительской сущности ISA?

Ответы [ 2 ]

1 голос
/ 20 января 2010

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

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

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

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

1 голос
/ 20 января 2010

TransactionType в родительской таблице полезен, если вы хотите выполнить запрос по всем транзакциям, например, чтобы суммировать суммы по типу транзакции:

select transactionType, sum(amount)
from transactions 
group by transactionType

Без столбца вы можете сделать это, запросив дочерние таблицы:

select 
    case when c.transactionId is not null then 'CHEQUE'
         when cc.transactionId is not null then 'CREDIT CARD'
         ...
    end
,   sum(amount)
from transactions t
left join cheque c on t.transactionId = c.transactionId
left join creditcard cc on t.transactionId = cc.transactionId
...
group by 
    case when c.transactionId is not null then 'CHEQUE'
         when cc.transactionId is not null then 'CREDIT CARD'
         ...
    end

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

...