最小化/避免数据重复并在复合键和唯一索引之间进行选择

Pau*_*aul 5 database-design sql-server sql-server-2014 unique-constraint

我对数据库开发完全陌生,我基本上正在尝试建立一个问题库。

问题必须根据类别、主题和主题进行分类。由于每个类可以有许多主题,并且每个主题可以在许多类中,因此我制作了一个名为 tb_SubjectClass 的连接表,其中主题和类是主键。

为了唯一标识任何章节,我需要主题和类的组合,因此我创建了 tb_Chapters,其中章节、主题和类作为主键,主题和类来自 tb_SubjectClass。然后我用 tb_Topics 重复了同样的事情,因为每个主题只能用主题、类和章节的组合来标识。

我把关系图放在下面。知道我期望在这个数据库中存储大约 50000 个问题(带有方程和图表)也可能是相关的。

数据库关系

主要问题:如果我决定坚持使用复合键/复合键,我的设计是否合适或可以进一步改进?

附带问题:在我的情况下,最好的方法是什么,考虑到以下因素:

  • 预计记录约 50000
  • 问题表 (tb_QnA) 将成为查询最多的表(用于选择和添加/删除数据)
  • 表 tb_Class、tb_Subjects 和 tb_SubjectClass 根本不会改变
  • 将数据库连接到 ac# winform 应用程序时易于编写查询(用于数据输入和生成报告)
  • 该项目将基于桌面

我主要一直都在数据库设计教程上tekstenuitleg.net和视频教程由WiseOwlTutorials。我最近也开始阅读Jan L. Harrington所著的Relational Database Design Clearly Explained一书。

Kon*_*bas 4

创建外键是否会导致数据重复/重复,或者只是对父表中存储的数据的引用/指针?

外键根据另一个表列中是否存在相同值来限制一个表列中的可能值。值存储在两个表中,因此它们是重复的。为了避免(实际上是减少)重复,应该使用标准化。这意味着您拥有存储所有不同值的引用表,而所有其他表仅包含该值的 ID。

是否应该尽可能避免使用复合键?

不。更重要的是,复合键是加快涉及多列的复杂条件查询的唯一方法。可以通过性能代价来避免复合键。

  • @Paul 整数 ID 在单个快速 CPU 优化操作中进行比较。当您首先比较字符串时,您需要将字符集和排序规则应用于两个操作数,然后逐个字符进行比较,直到满足第一个差异或一个或两个字符串将耗尽。整数的开销显着降低。某些数据类型(如“TIMESTAMP”或“BIT”)内部由某种 INT 表示,因此它们也与 INT 一样快。 (3认同)