SQL - 具有许多NULL值的大表或许多小表

时间:2018-02-07 11:48:42

标签: sql database-design

我试图了解是否更好地使用1个大表或许多较小的表。 我已经准备好了网络,它取决于每个案例,所以我想根据以下示例提出任何建议:

让我们假设我想创建一个包含资产所有特征的数据库。资产可以分为不同的资产类别(即股权,债券,现金等)。所有资产类别具有相似的特征(即ID代码,发行人名称),并且一些资产具有特定特征(债券具有到期日,而股票没有)。所以我的问题是我应该使用一个大表,当资产不适用时会留下NULL(如下所示)

ALL Characteristic in 1 Table

或者我应该使用多个表格并在每次需要生成报告时加入它们? (如下图所示)

Characteristics in multiple Tables

每个案例的利弊是什么?例如,如果我有1米不同的ID代码,它将需要1表选项的额外空间,而查询性能将显着下降与多表选项?

如果每种类型的独特特征为50且有10种不同的资产类别,该怎么办?我应该创建一个50 x 10 = 500列表(每行的大部分列为NULL)或者我有10个不同的表并在我想创建报告时使用LEFT JOIN吗?

2 个答案:

答案 0 :(得分:2)

您对某个特定应用程序的详细信息有一个真实的问题。我不确定它是否太广泛或寻求意见。问题本身很难回答,但让我试着给你解答它的指导。

你所拥有的(可能)是一种关系。第一个问题:你将在哪个级别拥有外键关系?如果一般关系是" asset",则需要主键,倾向于单个表。如果每个资产类都有自己的关系,那么每个资产类都需要一个主键,倾向于多个表。

当然,您可能期望两者都存在外键关系。并且有办法解决这个问题。

第二个问题是表现。通常,较宽的表(特别是具有固定长度的列)即使在列为空时也占用空间。所以,如果你有很多很多列,那么所有空白空间都会耗尽性能。

第三个问题是数据库的特定功能。例如,Postgres支持表中的继承。这非常准确地适合您的数据模型。 "资产"表可以具有一般属性。然后每个孩子" table可以有自己的属性。

或者,SQL Server支持稀疏表,这可以减轻在非常宽的表上浪费空间的影响。

第四个问题是安全和访问权限。不同的资产类别对访问有不同的要求吗?在表级提供访问通常比在行级提供访问更简单。

第五个问题涉及数据修改。是否同时插入了所有数据?不同的资产有不同的更新时间表吗?这如何影响最终用户查询?这可以建议将数据存储在单独的表中,以隔离更新。或者甚至有一个信息表来跟踪每个资产类别的最新更新。

因此,正如您的问题所详述的那样,还有其他考虑因素可以用于决策。

答案 1 :(得分:0)

数据库规范化

数据库规范化是一种在数据库中组织数据的技术。规范化是一种分解表的系统方法,以消除数据冗余和不良特性,如插入,更新和删除Anamolies。这是一个多步骤过程,通过从关系表中删除重复数据,将数据放入表格形式。

归一化主要用于两个目的,

  • 消除reduntant(无用)数据。
  • 确保数据依赖性有意义,即数据以逻辑方式存储。

规范化规则

  • 第一范式
  • 第二范式
  • 第三范式
  • BCNF
  

您关于第一范式的问题

第一范式(1NF)

根据First Normal Form,没有两行数据必须包含重复的信息组,即每组列必须具有唯一值,这样多列不能用于获取同一行。每个表应该组织成行,每行应该有一个主键,将其区分为唯一。

主键通常是单个列,但有时可以组合多个列来创建单个主键。

有关详情和示例,请参阅此链接:database-normalization