2011-05-14 113 views
0

我有两个数据库表(SQL CE)。 A 教师表和A 表。这两个表格具有一对多关系,其中一位教师具有多个类别(即类别具有外键teacher_id)。教师(行)的数量在运行时通过C#代码插入(或生成),因此类将多行插入到一个表中或将行分别插入到多个表中?

INSERT和SELECT中以下哪项更快?

  1. 每次插入新教师时,都会创建一个新的班级表(例如Class_teacher001)以存储教师拥有的任何班级。在这种情况下,每个类表不一定非常大,并且不需要外键,因为表名将标识自己。但是会有一个Teacher表和许多Class_xxx表

  2. 只有一个Teacher表和一个Class表。每个类行都有一个指向Teacher表的外键。只有一个Class表,但会变得很长。我担心搜索和读取会很慢
+0

选择1.不可能导致更多的教师和班级,整个数据库对于表的数量将是“太大”,这不适合sql-server-ce。尽管我使用SQL-Server,但我绝不会选择1. :) – Maidot 2011-05-14 03:39:44

回答

5

无论哪个更快,(2)是要走的路....只需创建索引来支持您的搜索。这几乎是所有关系数据库的使用方式。

维护选项(1)的噩梦让我不寒而栗

+0

当然。做第一个选项不会导致问题的结束。如果您确实担心表格的长度,请创建一个归档表格,并在旧的记录不再被引用时移动它们。 – IAmTimCorey 2011-05-14 03:38:55

1

好的,从哪里开始。首先,教师和班级之间的关系可能是多对多的,但正如你所描述的,至少是一对多的关系。

第一个选项绝对是错误的方法。永远不要动态创建表。第二种选择是如何处理这种事情。数据库功能强大,由非常聪明的人(通常)编写,并且可以处理比给定学校所有学生更多的行。

只要您对表格进行了适当的索引,他们就可以轻松地支持数亿条记录。

+0

我听说动态创建表是一个“坏”的事情,但从来没有任何人可以解释为什么它是坏的。要动态创建表只是另一个SQL查询。任何人都知道? – KMC 2011-05-14 03:55:32

+0

它导致了难以维系的混乱。 – 2011-05-14 03:58:48

0

我也同意米奇小麦。因为当你创建一个索引时,你的表根据我们的教师创建组合索引(Teacher_Id,Class_Id)进行物理排序。 虽然它将帮助快速检索选择状态。

0

除非你已经有性能问题,否则我不会担心它们。除了行数以外,还有许多可能导致性能问题的事情,并且应该根据它们的不同来处理它们。您必须更多地关注表影响性能的列数,而不是行数。也是数据库的并发连接数。一个表中有一百万行并不是那么多,这是另外两个项与许多行一起使数据库变慢。你应该使用第二个选项。