代码之家  ›  专栏  ›  技术社区  ›  user52212

如何处理宽、平表的列增长

  •  0
  • user52212  · 技术社区  · 17 年前

    DBA如何处理这个问题?我拥有一个现有的应用程序(vb6)和一个1999年编写的数据库。数据库设计相当“平坦”,这意味着主表相当宽(超过100列),开发人员继续将其他列附加到表的末尾。这导致了有很多空值的列,因为它们不直接与主键相关。

    我正在考虑将主表拆分为一种方法,将自己从“列爆炸”的年和年中抽象出来。我确信随着新需求的出现,新字段将继续添加。

    所以问题是,当需要新字段时,是否继续增加现有表的宽度?还是停止扩展现有表并将其拆分为单独的支持表,以容纳新字段,从而创建1对1关系?如果您要拆分主表,您的 命名规则 是吗?

    我们假设在这个例子中,我有一个名为“止赎”的表,有150个字段。 新的1对1表格的好名字是什么?止赎延长?止赎其他信息?

    顺便说一句,有些视图和存储过程需要修改以支持任何新表,但是在添加列时,这是不可避免的。

    提前谢谢你的任何想法。

    3 回复  |  直到 17 年前
        1
  •  1
  •   S.Lott    17 年前

    80%的时候,空值有明确的模式。

    这些模式定义了表的子类。在您的情况下,它们将是 Foreclosure .

    您的拆分应该基于这些子类关系。

    比如说,一些 丧失抵押品赎回权 实例中有一系列与法律程序相关的字段,几乎全部填写。等 丧失抵押品赎回权 实例的“法律程序”字段完全由空值填充。

    你有两个班。你需要弄清楚它们之间的关系——它们是超类子类还是其他超类的对等子类?

    这将告诉您如何划分表以使有用的事情发生。

    • 您可能有适当的超类子类关系

    • 你可能发现了一件事 LegalProceeding )应该一直是一张单独的桌子。它不应该被永久地加入 丧失抵押品赎回权 . 这是非常普遍的。

    现在您有了一些关系实现选项。

    • 一个常见的选择是将所有子类放到一个具有大量空值的大型表中。这就是你今天所拥有的,但它不起作用。

    • 一种选择是将两个子类关系表拆分为对等表,复制公共信息。

    • 一种选择是拥有一个超类表,其中包含对子类中其他信息的可选FK引用。

    • 一种选择是有一个子类表,其中必须有对超类信息的FK引用。

        2
  •  1
  •   KM.    17 年前

    除非你真的很勇敢,否则应用程序非常小/简单,或者存在重大的性能问题,不要修复模式。如果没坏,就别修了。

    只需使用相同的键创建一个新的取消抵押品赎回权扩展表,然后开始添加列。或者,您可以在新列出现时使用分组列创建适当的表。不管怎样,如果模式如此糟糕,我敢打赌代码是非常脆弱的。

        3
  •  1
  •   dsteele    17 年前

    你为什么觉得你有问题?在我看来,处理一个有很多列的表比处理大量更窄的表和您必须维护的所有相关视图更容易。