我为我的ASP.NET应用程序绘制了一个非常简单的数据库设计,并且在这里和那里我设法实现了我的设计...但是我希望将数据插入到这些表中并从中检索。
我的应用程序中一个非常重要的功能将需要来自所有7个表的所有信息用于某个记录,有时我需要让我的应用程序接受所有类型的相关数据并将每个数据放在右边表
我的问题是:
PS:在每两个具有(M:M)关系的表之间,考虑第三个表(该关系中的两个表中每个表都有两个主键)。
我熟悉JOIN和一切,但从未应用过如此大的设计......帮助! 提前谢谢!
答案 0 :(得分:6)
很抱歉吓到你,但这是一个非常小的数据库设计。
当我第一次开始需要为Web应用程序进行数据库设计时,我找到了一个拐杖。幸运的是,我当时使用的拐杖现在可以在免费工具NORMA中使用,它可以与Visual Studio 2008或2005一起使用(2010支持即将到来)。
我快速猜测了你的设计并获得了以下ORM模型:
这导致了一个包含十个表的数据库,包括多对多关系所必需的联结表。
NORMA工具可以从模型为几个不同的数据库生成DDL,还可以创建XML Schema和LINQ to SQL对象。
BTW,这是生成的数据库的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 :(得分:3)
这不是一个大设计,而是一个小设计。随着您进一步开发应用程序,它可能会增长。
您将通过从用户界面收集各种值并准备一系列要发送到数据库引擎的INSERT语句将信息放入表中。每个INSERT都会向表中添加一行。如果您使用的是数据库生成的ID,那么您可能必须在INSERT之间检索它们,并将该值用作后续INSERT语句的一部分。
您将使用一个或多个SELECT语句获取数据,这些语句从单个表中获取数据或从几个不同的表中获取JOIN数据。如果您发现这些JOINed SELECT语句构成了重要的常用概念,您可以选择将它们封装在某些VIEW中。
答案 2 :(得分:3)
试着回答你的问题:
这是一个非常小的设计。我目前的工作项目有150张桌子,排列方式与你的不同。
理想情况下,要输入一个新孩子,您只需在Kid表中输入数据。从GUI的角度来看,最简单的可视化方法是每个数据库表有一个GUI表。这样,您就可以在自己的表格中指定父母,赞助商,技能,工作领域等。
您必须根据需要自问多少适合每个孩子的信息。显示孩子与父母,最喜欢的玩具,赞助商,技能等的列表的界面将变得过于拥挤。根据您的应用程序,您可能希望更具体地了解您显示的数据。例如,您可能希望在按名称指定孩子时列出孩子的所有信息。例如,如果您需要查询由管道工(赞助商的工作领域)赞助的孩子,您可能并不关心他们最喜欢的玩具是什么。