Дизайн базы данных: есть ли способ улучшить этот дизайн?

Простой вопрос. Ниже приведен дизайн базы данных для хранения следующих записей.

account     TransactionType     TransactionName                 Amount      FeeTransactionId    TransactionId   RefTransactionId

Alex        [Deposit from]      [Credit Card x-1234]            [-100.00]               b           a   
Alex        [Deposit from]      [Credit Card Fee]               [-3.00]                             b           a
Alex        [Added funds from]  [Credit Card x-1234]            [100.00]                            c           a
Sys_        [Revenue from]      [Credit Card Deposit]           [3.00]                              d           a

дизайн

[Transaction]
Id
AccountId 
TransactionTypeId
TransactionName
Amount
FeeTransactionId
RefTransactionId

[Account]
Id
Name

[TransactionType]
Id
Name

Есть ли способ улучшить этот дизайн?

Примечание. валюта и дата отсутствуют. :)


person 001    schedule 03.07.2010    source источник
comment
Немного туманно в деталях. Если он работает, в чем причина желания его улучшить? Похоже, у вас есть базовая нормализация. Есть ли функции или функции, которые вы хотите добавить, но которые этот дизайн не поддерживает?   -  person spinon    schedule 03.07.2010
comment
Я думаю, вы имеете в виду AccountId в таблице транзакций, верно?   -  person BobbyShaftoe    schedule 03.07.2010


Ответы (2)


На первый взгляд выглядит нормально.

transaction_model_02

После некоторого рассмотрения кажется, что каждая транзакция связана с одной (и только с одной) другой транзакцией, и что значение этой связи зависит от типа транзакции. Следовательно, два самореферентных внешних ключа FeeTransactionId и RefTransactionID. В зависимости от типа транзакции один из этих ключей всегда равен NULL.

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

transaction_model_03

person Damir Sudarevic    schedule 03.07.2010
comment
+1 за красивую диаграмму, но что случилось с идентификатором FeeTransaction? (Ваш редизайн может определить связанную транзакцию так же, как и исходный дизайн, это нормально, однако теперь он больше не говорит мне, где я могу найти запись транзакции с комиссией). - person 001; 04.07.2010
comment
LinkedTransactionID может быть FeeTransactionID или RefTransactionID — в зависимости от TransactionTypeID. - person Damir Sudarevic; 04.07.2010

Дизайн в порядке. Красиво и нормализовано. Однако могут быть веские причины для денормализации. Обычно они включают какое-то удобство отчетности или оптимизацию. Без более подробной информации о проекте я действительно не могу дать какие-либо рекомендации по изменениям.

person Don Dickinson    schedule 03.07.2010