复杂的数据库操作

我为我的ASP.NET应用程序绘制了一个非常简单的数据库设计,并且在这里和那里我设法实现了我的设计…但是我希望将数据插入到这些表中并从中检索。

替代文字

在我的应用程序中一个非常重要的function将需要来自所有7个表的所有信息用于某个记录,有时我需要让我的应用程序接受所有类型的相关数据并将每个数据放在正确的表中

我的问题是:

  1. 拥有如此大的设计是正常的吗? 它对于真正的应用程序来说甚至是大的吗
  2. 如果我想添加一个新的孩子,我需要在所有表中填写所有表中的相关所需信息,我将有一个大表单,其中包含一些输入以接受数据,但我将如何将它们插入到我的数据库?
  3. 如果我想选择所有的孩子,基于这种设计的选择陈述是什么?

PS:在每两个具有(M:M)关系的表之间,考虑第三个表(在该关系中将具有两个表中的每一个的两个主键)。

我熟悉JOIN和一切,但从未应用过这么大的设计……帮助! 提前致谢!

很抱歉吓到你,但这是一个非常小的数据库设计。

当我第一次开始需要为Web应用程序进行数据库设计时,我发现了一个拐杖。 幸运的是,我当时使用的拐杖现在可以在免费工具NORMA中使用 ,它可以与Visual Studio 2008或2005(2010支持即将推出)配合使用。

我快速猜测了你的设计并获得了以下ORM模型:

孩子和赞助商

这导致了一个包含十个表的数据库,包括多对多关系所必需的联结表。

NORMA工具可以从模型为几个不同的数据库生成DDL,还可以创建XML Schema和LINQ to SQL对象。


顺便说一句,这是生成的数据库的ER图:

ER


我不明白为什么你需要在一个结果集中需要所有这些,但这是一个我认为可能会返回所有内容的查询。 我没有用数据测试过:

SELECT k.KidId, k.Name, k.FavoriteToy, s.SponsorId, s.Name, st.SponsorShipTypeCode, st.Description AS SponsortshipTypeDescription, fw.FieldOfWorkCode, fw.Description AS FieldOfWorkDescription, Skill.SkillCode, Skill.Description AS SkillDescription, Parent.ParentId, Parent.Name AS ParentName FROM Kid k LEFT OUTER JOIN KidHasParent ON KidHasParent.KidId = k.KidId INNER JOIN Parent ON Parent.ParentId = KidHasParent.ParentId LEFT OUTER JOIN KidHasSkill ON KidHasSkill.KidId = k.KidId INNER JOIN Skill ON Skill.SkillCode = KidHasSkill.SkillCode LEFT OUTER JOIN Sponsor s ON s.SponsorId = k.SponsorId INNER JOIN SponsorIsOfSponsorShipType Sst ON Sst.SponsorId = s.SponsorId INNER JOIN SponsorShipType st ON st.SponsorShipTypeCode = sst.SponsorShipTypeCode LEFT OUTER JOIN SponsorParticipatesInFieldOfWork sfw ON sfw.SponsorId = s.SponsorId INNER JOIN FieldOfWork fw ON fw.FieldOfWorkCode = sfw.FieldOfWorkCode 

我通过查看ORM图来了解哪些路径是可选的(LEFT JOIN),然后使用工具(ApexSQL Edit)来创建此查询,该工具使用外键来帮助我构建连接。 这花了不到十分钟。

  1. 这不是一个大设计,而是一个小设计。 随着您进一步开发应用程序,它可能会增长。

  2. 您将通过从用户界面收集各种值并准备要发送到数据库引擎的一系列INSERT语句将信息放入表中。 每个INSERT都会向表中添加一行。 如果您使用的是数据库生成的ID,则可能必须在INSERT之间检索它们,并将该值用作后续INSERT语句的一部分。

  3. 您将使用一个或多个SELECT语句来获取数据,这些语句从单个表中获取数据或从几个不同的表中获取JOIN数据。 如果您发现这些JOINed SELECT语句构成了重要的常用概念,您可以选择将它们封装在某些VIEW中。

试着回答你的问题:

  1. 这是一个非常小的设计。 我目前的工作项目有150张桌子,排列方式与你的不一样。

  2. 理想情况下,要输入一个新孩子,您只需在Kid表中输入数据。 从GUI的角度来看,最简单的可视化方法是每个数据库表有一个GUI表。 这样,您可以在自己的表格中指定父母,赞助商,技能,工作领域等。

  3. 您必须根据需要自问多少适合每个孩子的信息。 一个显示孩子与父母,最喜欢的玩具,赞助商,技能等等的列表的界面将变得过于拥挤。 根据您的应用程序,您可能希望更具体地了解您显示的数据。 例如,您可能希望在按名称指定孩子时列出所有孩子的信息。 例如,如果您需要查询由管道工(赞助商的工作领域)赞助的孩子,您可能并不关心他们最喜欢的玩具是什么。