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

Database design 我应该复制表以进行正确的规范化数据库设计吗?,database-design,Database Design,我正在尝试创建一个小应用程序,它将允许一个人处理收到的捐款,并根据预定的百分比金额在接收者列表中分发捐款 在表格设计过程中,我遇到了一个不确定如何进行的地方,我正在寻求如何设计表格的建议。我首先把所有人放在同一张桌子上,不管他们是捐赠者还是接受者,因为每个人都可能给予和/或接受 正如您在下面看到的,tblGiverReceiver是中心表,但是我不确定是否存在循环引用这一事实会给我带来问题,以及从规范化的角度来看,它是否是一个糟糕的设计 以下是我的设计: 我知道命名约定不正确。我还在设计阶段,

我正在尝试创建一个小应用程序,它将允许一个人处理收到的捐款,并根据预定的百分比金额在接收者列表中分发捐款

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

正如您在下面看到的,tblGiverReceiver是中心表,但是我不确定是否存在循环引用这一事实会给我带来问题,以及从规范化的角度来看,它是否是一个糟糕的设计

以下是我的设计:

我知道命名约定不正确。我还在设计阶段,发现用这样的名字来帮助我思考更容易

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


编辑:我阅读了一位同事的建议链接(),但是提出的问题不是我想要的。

你的应用程序是关于人、地址、捐款和收到的款项的,所以它们似乎是合适的表格。以下是我的建议,以第五范式作为示例设计实现

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
表格和关系从事实陈述开始,比如“人有语言偏好”。我指定了事实,然后使用我们的方法生成模式设计。很抱歉,我无法理解“百分比金额”的概念,因此不包括在内

以下是模式:

下面是生成模式的事实

以下是限制条件


我认为您可能会发现在我之前的回答中看到模式图的SQL DDL会有所帮助

这个DDL也是从我们的NORMA工具生成的。我花了大约30秒来选择合适的选项,然后瞧!大约一毫秒后,我们得到了第五范式的SQLDDL

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

请转述或引用其他文本。仅将图像用于不能表示为文本或扩充文本的内容。无法搜索或剪切粘贴图像。包括带有图像的图例/图例和说明。使你的文章独立。PS框之间的线不是对称的,这是一个常见问题。在考虑发帖之前,请总是用谷歌搜索你的错误信息或你的问题/问题/目标的许多清晰、简洁和准确的措辞,有没有你的特定字符串/名称,并阅读许多答案。如果你发布一个问题,用一句话作为标题。请参阅文本上方的投票箭头和鼠标。感谢@philipxy及时提供建设性意见。我对数据库设计相当陌生,并试图改进。下次我发布一个涉及ERD的问题时,我将尝试在没有图片的情况下包含它。在提问之前,我尽可能多地阅读了这个主题,并浏览了其他StackOverflow用户之前提出的建议问题的完整列表。我不确定你上面建议的那个是否在名单上,但我必须承认,即使是在名单上,我也无法理解。我以前在这个网站上问过很多问题,但还没有正确回答。所以,这是一个学习任何东西的好地方,买一本教科书。这里尤其有很多关系模型的废话&在web上。阅读已出版的关于信息建模和数据库设计的学术教科书。(记录和使用设计的语言和工具手册不是信息建模和数据库设计教科书。)几十本已出版的学术信息建模和数据库设计教科书都是pdf格式的在线免费教科书。斯坦福大学有一个免费的在线课程。尽管如此,关于SQL/DB子类型/继承/多态性还是有很多问题。感谢您的智慧!如果我上传的事实清单作为文本,我会松散的颜色,它是传达意义的颜色。你的评论不是不给文本的理由。(此外,你没有给出任何传说,因此颜色无法传达任何信息。)谢谢@KenEvans。我将尝试使用上面使用的普通工具。这将是一个伟大的帮助,在我未来的设计,我相信@viRg NORMA工具是visualstudio的扩展,因此您必须首先安装免费的visualstudio社区版。我们的最新版本适用于Visual Studio 2019。只需按照我主页上“事件与新闻”中的说明操作即可。@philipxy Blue-来自一阶逻辑绿色-谓词紫色-对象类型。现在快乐吗?