我应该复制表格以进行正确的规范化数据库设计吗?

时间:2019-05-07 15:43:21

标签: database-design

我正在尝试创建一个小型应用程序,该应用程序将允许一个人处理传入的捐款,并根据预先确定的百分比将它们分配到一系列收件人中。

在桌子设计过程中,我来到了一个不确定如何进行的地方,并正在寻求有关如何设计桌子的建议。我首先将所有人都放在同一张桌子上,而不管他们是捐赠者还是接受者,因为每个人都可能会给予和/或接受。

如下所示,tblGiverReceiver是中心表,但是我不确定是否存在循环引用这一事实是否会给我带来麻烦,以及从规范化的角度来看这是否是不良设计。

这是我的设计的样子:

ERD

我知道命名约定不正确。我仍处于设计阶段,发现使用这样的名称来帮助我思考更容易。

我应该复制tblGiverReceiver表并将其重命名为tblGiver / tblReceiver,还是可以通过这种方式将表链接回自身?

编辑:我通读了一个stackoverflow-er(How can you represent inheritance in a database?)的建议链接,但是提出的问题不是我想要的。

2 个答案:

答案 0 :(得分:1)

您的应用程序涉及人员,地址,捐赠和已收款项,因此它们似乎是适当的表格。这是我的建议,以第5个范式的示例设计形式实现。

表和关系从事实陈述开始,例如“人具有LanguagePreference”。我指定了事实,然后使用我们的NORMA tool来生成模式设计。抱歉,但我无法理解“百分比金额”的概念,因此未包括在内。

以下是架构:

enter image description here

以下是生成架构的事实。

enter image description here

这里是约束。

enter image description here

答案 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