代码之家  ›  专栏  ›  技术社区  ›  Raymond He

关于具有公共属性的SQL表[已关闭]

  •  -2
  • Raymond He  · 技术社区  · 7 年前

    我在想一个问题,这在我们的日常发展生活中经常发生。 例如,我有一个20列的表1,30列的表2,40列的表3。但对于表1、2、3,它们有共同的10列。

    有几个例子可以说明这一点。

    宠物店有关于狗、猫、金鱼等的数据。所有宠物都有名字、价格、获得日期等。但每种宠物都有其他宠物没有的属性。

    关于车辆的数据库包含关于汽车、卡车和摩托车的数据。它们都有车辆识别号、注册号和制造年份。但它们都有自己的特点。

    客户数据库包含客户公司和客户个人的数据。它们都有电话号码,但属性也不同。

    那么DB结构的合理设计是什么呢。

    A:创建3个包含20、30、40列的表? B:创建3个包含10、20、30列的表,以及另一个包含10个公共列的表?如果我搜索一条记录,我需要加入公共表中的公共信息

    那么,我如何分析这个性能问题呢?不知道sql的工作原理,会为此做一些调查工作。 任何人都可以分享你对设计和不同性能的想法

    1 回复  |  直到 7 年前
        1
  •  3
  •   Walter Mitty    7 年前

    这种问题在数据建模中反复出现。在ER建模中称为“泛化/专门化”,在对象建模中称为“超类/子类”。

    对象建模师使用对象模型中内置的继承特性来非常轻松地解决问题。子类只是扩展了超类。 关系建模师面临一个问题。如何设计表以模拟继承带来的好处?这就是你提出的问题。

    最简单的技术称为单表继承。关于所有子类的数据都被分组到超类的一个表中。有一列object\u type,它将单个类型的所有对象分组在一起。任何对象都不能属于多个类型。如果一列与其中一个子类无关,则与该子类相关的行中该列将保留为NULL。

    这种简单的解决方案适用于更小更简单的情况。大量空值的存在会增加一点点存储开销,也会增加一点点检索开销。如果对可空列进行布尔测试,开发人员可能必须学习SQL三值逻辑。起初,这可能令人困惑,但人们会习惯它。

    还有另一种技术,称为类表继承。在这个设计中,除了所有专用子类的组合表之外,每个专用子类都有单独的表。当需要有关特定类型对象的所有数据时,可以将常规表与相应的专用表连接起来。此设计中的空值较少,但要进行更多的连接。这种技术在更大、更复杂的情况下效果更好。

    还有第三种技术称为共享主键。这种技术通常与类表继承结合使用。子类的专用表具有通用表中相应条目的主键副本作为其主键。此id列可以声明为主键和外键。

    当要添加新对象时,这需要一些额外的编程,但它使连接变得简单、容易和快速。

    超类和子类在现实世界中经常发生。使您的设计简单、合理。测试初始设计的性能。如果需要,可以调整它。