我正在尝试创建一个小型应用程序,该应用程序将允许一个人处理传入的捐款,并根据预先确定的百分比将它们分配到一系列收件人中。
在桌子设计过程中,我来到了一个不确定如何进行的地方,并正在寻求有关如何设计桌子的建议。我首先将所有人都放在同一张桌子上,而不管他们是捐赠者还是接受者,因为每个人都可能会给予和/或接受。
如下所示,tblGiverReceiver是中心表,但是我不确定是否存在循环引用这一事实是否会给我带来麻烦,以及从规范化的角度来看这是否是不良设计。
这是我的设计的样子:
我知道命名约定不正确。我仍处于设计阶段,发现使用这样的名称来帮助我思考更容易。
我应该复制tblGiverReceiver表并将其重命名为tblGiver / tblReceiver,还是可以通过这种方式将表链接回自身?
编辑:我通读了一个stackoverflow-er(How can you represent inheritance in a database?)的建议链接,但是提出的问题不是我想要的。
答案 0 :(得分:1)
您的应用程序涉及人员,地址,捐赠和已收款项,因此它们似乎是适当的表格。这是我的建议,以第5个范式的示例设计形式实现。
表和关系从事实陈述开始,例如“人具有LanguagePreference”。我指定了事实,然后使用我们的NORMA tool来生成模式设计。抱歉,但我无法理解“百分比金额”的概念,因此未包括在内。
以下是架构:
以下是生成架构的事实。
这里是约束。
答案 1 :(得分:1)
我认为您可能会发现在我先前的答案中看到架构图的SQL DDL会有所帮助。
此DDL也由我们的NORMA工具生成。我花了大约30秒的时间来选择合适的选项,然后才是Voila!一毫秒左右后,我们有了第五种普通形式的SQL DDL。
CREATE SCHEMA "Donations"
GO
CREATE TABLE "Donations".Person
(
personNr int NOT NULL,
addressNr int NOT NULL,
firstName nchar(30) NOT NULL,
languagePref nchar(15) NOT NULL,
lastName nchar(40) NOT NULL,
nickName nchar(100) NOT NULL,
title nchar(50) NOT NULL,
CONSTRAINT Person_PK PRIMARY KEY(personNr)
)
GO
CREATE TABLE "Donations".Address
(
addressNr int NOT NULL,
address1 nchar(40) NOT NULL,
address2 nchar(40) NOT NULL,
country nchar(40) NOT NULL,
postalCode nchar(10) NOT NULL,
province nchar(30) NOT NULL,
address3 nchar(40),
CONSTRAINT Address_PK PRIMARY KEY(addressNr)
)
GO
CREATE TABLE "Donations".Donation
(
donationNr int NOT NULL,
amount decimal(6,2) NOT NULL,
"date" datetime NOT NULL,
personNr int,
CONSTRAINT Donation_PK PRIMARY KEY(donationNr)
)
GO
CREATE TABLE "Donations".Payment
(
paymentNr int NOT NULL,
amount decimal(6,2) NOT NULL,
"date" datetime NOT NULL,
personNr int,
CONSTRAINT Payment_PK PRIMARY KEY(paymentNr)
)
GO
ALTER TABLE "Donations".Person ADD CONSTRAINT Person_FK FOREIGN KEY (addressNr) REFERENCES "Donations".Address (addressNr) ON DELETE NO ACTION ON UPDATE NO ACTION
GO
ALTER TABLE "Donations".Donation ADD CONSTRAINT Donation_FK FOREIGN KEY (personNr) REFERENCES "Donations".Person (personNr) ON DELETE NO ACTION ON UPDATE NO ACTION
GO
ALTER TABLE "Donations".Payment ADD CONSTRAINT Payment_FK FOREIGN KEY (personNr) REFERENCES "Donations".Person (personNr) ON DELETE NO ACTION ON UPDATE NO ACTION
GO