我注意到这里很多人引用的表格中有 20 多个(我见过多达 55 个)列。现在我不想假装自己是数据库设计专家,但我一直听说这是一种可怕的做法。当我看到这个时,我通常建议分成两个具有一对一关系的表:一个包含最常用的数据,另一个包含最不常用的数据。但与此同时,可能存在性能问题(较少的 JOIN 等)。所以我的问题是这样的:

当涉及到真正大规模的数据库时,拥有大量列实际上是否有优势,尽管这通常会导致许多 NULL 值?

哪个对性能影响更大:大量列包含大量 NULL,还是少量列包含大量 JOIN?

有帮助吗?

解决方案

表的设计取决于其需要存储的实体。如果所有数据都属于一起,则50列(甚至100列)可能是正确的事情。

只要桌子是 归一化, ,除了数据库功能和优化需求外,没有关于大小的经验法则。

其他提示

我同意ODED。我已经看到其中有500列的桌子,其中所有的列都位于正确的位置。只需考虑一个人可能希望存储关于日常物体的事实的数量,您就会很快明白为什么。

如果证明不便选择所有这些列,或者在仅对其中一小部分感兴趣的时候指定要选择哪些列,您可能会发现值得定义视图。

多少列有多少列?

当您认为它不再有意义或添加另一列是正确的。

通常取决于应用。

ODBC的字符限制为8000 ....因此,这是一个物理上限,这是一个高度令人沮丧的。

我在一张有138列的桌子上工作。这是可怕的,本来可以归一化的。尽管该数据库似乎是创建某人的想法,他们想知道为什么数据库设计中有约定并决定一次测试它们。

当您进入数据仓库和报告服务器时,拥有非常宽的桌子非常普遍。它们的速度要快得多,意味着您不必将数据库全部存储在RAM中以进行性能。

根据我的经验,最好减少连接,因为这些连接往往发生得太频繁,尤其是在大型数据库中。只要您的数据库表被设计为存储单个实体(学生、教师等),这应该没问题。这样这将在稍后的代码中表示为一个对象。因此,如果将实体拆分为多个表,则必须使用多个联接才能稍后填充对象。此外,如果您使用 ORM 生成数据访问层(例如 .Net 中的 Linq),将为每个表生成单独的类(当然它们之间存在关系,但仍然如此),这将更难使用。

另一件事是,您可以指定在查询中返回哪些列,这将减少传递到应用程序的数据,但如果您甚至需要另一个表中的单个列,则必须进行联接。在大多数情况下,由于您有如此多的列,那么数据库中存储大量数据的可能性就很高。所以这个连接比 NULL 危害更大。

我从事的每个项目都是不同的,所以你应该找到每个故事的平衡。

太多的列会导致很多零(邪恶)和桌子映射到的笨拙的物体。这损害了IDE的可读性,并阻碍了维护(增加的发展成本)。如果您需要快速读取,在某些情况下使用不利的表,例如仅用于报告或查询的表(搜索“ CQRS”模式)。是的,“人”具有一百万个属性,但是您可以分解这些单刺表(设计先于标准化)以匹配较小的实体(“地址”,“电话”,“ hobby”),而不是为每个新用例添加新列。具有较小尺寸的对象(和表格)带来了许多优势;它们启用了单位测试,OOP和扎实实践之类的事情。

另外,由于它构造了许多列以避免加入,因此我认为避免加入的性能会通过索引维护而丢失,这是典型的读取和写入的工作量。为了阅读性能,在字段上添加索引可能表明需要将这些字段移至自己的表中。

哪个是性能的打击:许多列有很多空的列,或者较少的列有很多连接?

这完全取决于您存储的数据,您制作的索引等等。没有人能确保您在不知道您存储的内容的情况下比另一个更好的工作。通常,如果您有大表格,则规范化规则将“强制”将数据分开与不同的表和用户FKeys分开,但我不同意它的性能总是比一张大表更好。您可以以数十个查询有时会导致错误的查询结束,因为有更多机会在简单的查询中创建错误的机会。

如果您发布了您正在做的事情的一些要求,也许我们可以帮助您正确设计DB。

这也很大程度上取决于您的桌子酶。如果您想优化阅读,那么将其全部放在一张桌子中可能是一个好主意。

在No-SQL世界(例如Cassandra/HBase)中,列的数量没有限制,实际上,拥有许多列是一种好习惯。这也来自存储的方式(没有差距)。在调查时值得。

在任何数据集中,哪些业务需求需要60列以上,更不用说TSQL表了吗?如果有这样的业务需求,那么枢轴是按顺序进行的,并且列应该是行。例如,在采矿业中,测定法可能会进行600种不同的测量。每个测量的名称可以是列名称。但是,为什么要创建一个具有600列和行测量行的表呢?地质学家也许每天都会测量矿山,并填写一排600列的日志。在我看来,地质学家会失去理智,他不会找到足够长的纸。也许卷会起作用,但是他将不得不展开卷卷,然后再次滚动。

最好使用单个表来避免在查询时避免使用连接的位置取决于列是相同的实体还是不同的实体。

例如,假设您正在为工作流进行数据库设计,其中一些领域将由初级工人和一些高级工人进行编辑。在这种情况下,最好将所有列在单个表中放置。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top