Таблицы SQL Debit и Credit - PullRequest
0 голосов
/ 22 мая 2018

Я получил проект базы данных из моего университета, чтобы закончить, но я нахожусь в структуре таблицы дебетов и кредитов, что, как сделать это в SQL Server, мой код показан здесь:

create table AcCat
(
    CatID smallint Primary Key,
    CatName nvarchar(20)
)

Create Table Accounts
(
    AcID int Primary key,
    AcNumber int,
    AcName nvarchar(20),
    AcCategory smallint references AcCat(CatID)
)

Create Table Transactions
(
    TrnRef bigint primary key identity (1,1),
    TrnDate datetime
)

Create Table Voucher
(
    VID bigint primary key identity (1,1),
    TranRef bigint references Transactions(TrnRef),
    AccountNo int references Accounts(AcID),
    DrCr nvarchar(2),
    Amount money,
    Narration nvarchar(100)
)

Create Table Voucher_2 
(
    V2ID bigint primary key identity (1,1),
    V2TranRef bigint references Transactions(TrnRef),
    V2DebitAc int references Accounts(AcID),
    V2CreditAc int references Accounts(AcID),
    Amount money,
    Narration nvarchar(100)
)

Я не знаю, структура таблиц выше верна или нет, но я застрял в таблицах Voucher и Voucher_2, которые я должен использовать для своей базы данных.

Вывод таблиц следующий

Мои таблицы Вывод

1 Ответ

0 голосов
/ 22 мая 2018

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

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

SELECT
   ac.AcNumber,
   SUM(CASE WHEN DrCr = 'Cr' THEN Amount
                             ELSE -Amount END) as Balance
FROM
   Accounts ac
      inner join
   Voucher v
      on
         ac.AcID = v.AccountNo
WHERE
  ac.AcNumber = 1010
GROUP BY
  ac.AcNumber

SELECT
   ac.AcNumber,
   SUM(CASE WHEN V2DebitAc = V2CreditAc THEN 0
            WHEN V2CreditAc = ac.AciD   THEN Amount
                                        ELSE -Amount END) as Balance
FROM
   Accounts ac
      inner join
   Voucher_2 v
      on
         ac.AcID = v.V2DebitAc or
         ac.AcID = v.V2CreditAc
WHERE
  ac.AcNumber = 1010
GROUP BY
  ac.AcNumber

Если все транзакции должны быть сбалансированными , как вы будете гарантировать, что в Voucher всегда есть пары строк, которые соответствуют друг другу?

Если у вас естьчтобы применить проценты к другим исправлениям учетной записи, с какой учетной записью вы будете сопоставлять учетные записи в Voucher_2?

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


Одна вещь, которую я бы серьезно порекомендовал исправить, хотя - наличие всех AcNumber, AccountNum и AcID похоже на рецепт путаницы.Вероятно, я бы просто использовал AcID везде за пределами таблицы Accounts, если только вы не хотите пойти еще дальше и просто использовать AcNumber в качестве естественного ключа и использовать его везде и удалить AcIDс картинки.Конечно, я не ожидал (до написания запросов), что я найду AccountNum также на картинке, и это не то же самое, что AcNumber.

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

...