我从我的大学完成了一个数据库项目,但我在借记卡和信用表的结构中堆栈如何在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
表中,我应该将其用于我的数据库。
表格输出如下
答案 0 :(得分:1)
任何一个似乎都可以使用。您是否获得了应该在您的系统上运行的示例查询?如果是这样,您是否尝试过编写这些查询并查看您的一个或另一个结构是否使所有这些查询更难或更简单?另外,您是否考虑过您希望数据库强制实施的完整性约束?
例如,可以使用任一结构合理地执行查找帐户的当前余额。
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
,而且 与{{ 1}}。
如果可能,我建议尽可能少地使用名称。理想情况下,在您的架构中遇到特定列名称的任何地方,它应该表示相同的概念,并且您不应该在任何其他名称下遇到相同的概念。