使用C#/ASP.NET开始学习SQL

5

如果这个问题已经被问过了,我很抱歉,但我无法在任何地方找到清晰的答案。

我决定开始学习如何更好地使用关系型数据库,特别是SQL。这是一个初学者的问题,但对于入门来说可能至关重要。

我有些困惑,关于如何最好地利用SQL(或其他)。在大学里,我使用JSON字符串访问数据库(用于移动应用程序等),但我从未设计和构建过自己的数据库,因为我的导师为我们提供了所需的数据库。

假设我有一个C#应用程序,保存家谱信息(即家庭及其成员),我想将每个人存储在数据库中。我是否可以简单地使用已有的结构,但将其保存到数据库的字段中,而不是XML或文本文件?还是反过来,我需要创建一个具有所需字段的数据库,然后只需从C#应用程序中检索此数据,并随意操作数据,使应用程序完全不同(因此C#应用程序基本上不会保存/存储任何数据,而只是从数据库中获取数据)?

令我困扰的是,通常情况下,我会将C#对象存储在字典或列表中,那么我是否应该直接从数据库检索?还是从数据库中检索并将数据存储到普通结构中,然后从那里进行操作(这肯定会破坏从数据库中快速搜索的目的)?

我可能有点过于思考了。希望这有意义。提前致谢。


1
如果您在http://programmers.stackexchange.com/上提出问题,您将会得到更多的关注(stackoverflow只是stackexchange中的众多网站之一)。 - EtherDragon
5个回答

7

我应该只使用我已经创建的结构来建立应用程序,或者要创建一个带有所需字段的数据库?我认为这是你问题的关键。

从数据库开始

对我而言,在构建使用后端数据库的应用程序时,实体关系图非常重要。我在这里找到了一个相当不错的教程:http://www.sum-it.nl/cursus/dbdesign/english/index.php3,但你可以轻松找到适合你学习风格的教程。关键点是你正在尝试以某种方式捕捉问题领域(需要你的应用程序的那个真实世界),以便你的应用程序能够进行建模。一旦有了相关表的E-R图,就更容易理清细节。在SQL Server 2008(Express版本)中使用SQL Management Studio,您可以创建一些基本表并在那里构建E-R图,并让它为您生成关系。然后,你可以随意检查所用的SQL并进行细化。

就我个人而言,我总是从问题域入手,然后构建E-R图,再构建数据库。当我相信数据库反映了问题领域时,我开始构建C#应用程序。

从C#应用程序开始

但是,真正重要的是以有意义和有效的方式对现实世界进行建模。在你的情况下,你已经拥有了C#中创建的结构作为起点,可以使用它们作为起点来构建E-R图。如果你发现通过启动C#应用程序并构建反映它的数据库更容易,那也没问题。也许你已经有了一个帮助你有效捕捉问题领域的方法。无论你做什么,都是迭代的过程:构建C#代码可能会揭示底层数据库设计的问题,反之亦然。

制图-E-R还是UML?

我个人相信这整个业务如此复杂,以至于你真的需要一些图表。

  • 使用E-R图可视化你的数据库
  • 使用UML类图可视化你的C#应用程序

当你朝着一个工作的应用程序前进时,你会看到这两个图表开始相匹配或至少相互反映得非常紧密。在这两种情况下(实体或类),了解对象之间的关系将在查询数据库时非常重要,因为理解表之间的关系至关重要(特别是使用1对多关系来解决复杂的多对多关系)以及连接表的各种技术在查询中(INNER或OUTER join等)。无论你的C#应用程序有多聪明,你在某个时候都需要至少了解一些SQL语言的复杂性-如果可以参考E-R图,那就更容易了。

存储在哪里?

我的疑问是,通常我会将C#对象存储在字典或列表中,那么我是否应该直接从数据库中检索?
毫无疑问要存储在数据库中。例如,一个名为Family的C#类将具有属性FamilyName,并带有setter方法。如果您发现拼写错误并想更改名称,则setter方法将打开与数据库的连接,使用指定的家庭名称(可能还包括家庭ID)作为参数运行UPDATE查询,并相应地更新基础字段。检索数据将涉及运行SELECT查询等。
结论
进行一些教程,了解如何检查问题域,创建实体关系图并基于该图构建一组相关表。我相信这样做可以更容易地跟踪您构建的C#类与后端数据库的通信。
以下是有关家庭及其成员的简单E-R图示例:
开始时,您可能认为成员和家庭可以在一个表中,但随后您会发现这会导致很多重复,因此您需要将它们分开为具有一对多关系的家庭和成员表,但随后您会意识到,通过婚姻等方式,人们可以属于多个家庭,因此您需要创建多对多关系。我认为E-R图是解决此类复杂性的最佳场所。

0

不知道你的结构长什么样子或者你的数据库将如何设计,这很难回答。但是你应该能够使用现有的数据结构,只需从数据库中导入数据而不是XML文件即可。

研究一下Linq-to-XML,C#有一个强大的库与SQL交互。起初可能有点困惑,但一旦学会了就非常强大。


谢谢回复。我并不是特别想解决一个具体的问题,我更多地是在询问什么时候最好采取哪种行动的建议 - 所以我不想停留在给出的例子上 :)因此,只需将数据保存到数据库而不是 XML 文件中,数据库是否只需要包含与相应对象匹配的字段即可。一个非常简单的例子是保存一个 familyMember(int,string,string) C# 对象,那么数据库应该包括一个表,用于保存一个整数和两个字符串值,并且我只需相应地向表中添加数据即可? - MartinM
是的,那将非常好用。Linq-to-SQL 将帮助您从数据库中创建 C# 数据对象。它还可以轻松更新、添加、删除、选择对象等操作。 - Avada Kedavra
好的,那我会试着去做。谢谢你的帮助! - MartinM

0

如果我没理解错的话,您也在询问是否应该从数据库中检索所有记录并将它们存储为集合中的对象,还是从数据库中检索选定的记录并使用数据集结果而不将其放置在特定结构中。

我倾向于从数据库中选择我想要的记录,然后将结果加载到我的特定类/结构中。这样,您可以将操作方法添加到持有记录结果的类中等等,而无需将数据集结果传递给每个方法。但是,当批量更新更有效时,您会发现自己一直在进行单个更新...如果这有意义的话。


是的,那就是我主要想问的 - 谢谢。我喜欢将数据加载到特定结构中的想法更好。我只是有点担心这可能被认为是一种不好的方法,因为我猜从数据库检索然后存储到结构中可能会更慢?我猜这可能并不太重要。 - MartinM
最显著的时间将是与数据库之间数据传输的时间。将数据放入结构体变量中可能是微不足道的。 - IntelOrca

0

看一下实体框架的代码优先。如果你的数据结构是应用程序中的类,那么有技巧可以使用它来从中创建数据库模式。至于数据,将其存储在数据库中,并用它填充列表和字典。或者用它填充个人家谱类别的列表。


0
如果您想编写自己的数据类,可以参考我个人编写的免费教程这里。但是,我绝对不建议使用 ASP.NET 中的数据源,因为这些向导就像 ASP.NET 世界中的巴蒂·克劳奇一样,一开始看起来很好,但最终会被证明是邪恶的,因为您始终希望能够调整它们,但您不会理解如何进行调整。

感谢您发布的答案!请务必仔细阅读有关自我推广的常见问题解答。还要注意,每次链接到您自己的网站/产品时都必须发布免责声明。 - Andrew Barber

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接