单表继承(也称为每层次结构表继承):

在第一个选项中使用单个表可能是最简单的设计。如您所述,许多属于子类型的NULL属性必须在不适用这些属性的行上赋予值。使用此模型,您将拥有一个策略表,它看起来像这样:

+------+---------------------+----------+----------------+------------------+

| id   | date_issued         | type     | vehicle_reg_no | property_address |

+------+---------------------+----------+----------------+------------------+

|    1 | 2010-08-20 12:00:00 | MOTOR    | 01-A-04004     | NULL             |

|    2 | 2010-08-20 13:00:00 | MOTOR    | 02-B-01010     | NULL             |

|    3 | 2010-08-20 14:00:00 | PROPERTY | NULL           | Oxford Street    |

|    4 | 2010-08-20 15:00:00 | MOTOR    | 03-C-02020     | NULL             |

+------+---------------------+----------+----------------+------------------+

\------ COMMON FIELDS -------/          \----- SUBTYPE SPECIFIC FIELDS -----/

保持设计简单是一个优点,但这种方法的主要问题如下:在添加新的子类型时,您必须更改表以适应描述这些新对象的属性。当您有许多子类型,或者您计划定期添加子类型时,这很快就会出现问题。

数据库将无法强制应用哪些属性,哪些属性不适用,因为没有元数据来定义哪些属性属于哪些子类型。

您也无法强制执行NOT NULL应该是必需的子类型的属性。您必须在应用程序中处理此问题,这通常不太理想。

具体表继承:

解决继承问题的另一种方法是为每个子类型创建一个新表,重复每个表中的所有公共属性。例如:

--// Table: policies_motor

+------+---------------------+----------------+

| id   | date_issued         | vehicle_reg_no |

+------+---------------------+----------------+

|    1 | 2010-08-20 12:00:00 | 01-A-04004     |

|    2 | 2010-08-20 13:00:00 | 02-B-01010     |

|    3 | 2010-08-20 15:00:00 | 03-C-02020     |

+------+---------------------+----------------+

--// Table: policies_property

+------+---------------------+------------------+

| id   | date_issued         | property_address |

+------+---------------------+------------------+

|    1 | 2010-08-20 14:00:00 | Oxford Street    |

+------+---------------------+------------------+

这种设计基本上解决了单表方法确定的问题:现在可以使用强制属性NOT NULL。

添加新子类型需要添加新表而不是向现有表添加列。

也没有为特定子类型设置不适当属性的风险,例如vehicle_reg_no属性策略的字段。

type单表方法中不需要属性。现在,类型由元数据定义:表名。

然而,这个模型也有一些缺点:公共属性与子类型特定属性混合在一起,并且没有简单的方法来识别它们。数据库也不会知道。

定义表时,必须重复每个子类型表的公共属性。那肯定不是干的。

搜索所有策略而不管子类型变得困难,并且需要一堆UNIONs。

无论类型如何,您都必须查询所有策略:SELECT     date_issued, other_common_fields, 'MOTOR' AS typeFROM       policies_motorUNION ALLSELECT

date_issued, other_common_fields, 'PROPERTY' AS typeFROM       policies_property;

请注意,添加新子类型将需要修改上述查询,并UNION ALL为每个子类型添加一个额外的查询。如果忘记此操作,这很容易导致应用程序中出现错误。

类表继承(又称每种类型的表继承):

这是@David在另一个答案中提到的解决方案。您为基类创建一个表,其中包含所有常用属性。然后,您将为每个子类型创建特定的表,其主键也充当基表的外键。例:CREATE TABLE policies (

policy_id          int,

date_issued        datetime,

-- // other common attributes ...);CREATE TABLE policy_motor (

policy_id         int,

vehicle_reg_no    varchar(20),

-- // other attributes specific to motor insurance ...

FOREIGN KEY (policy_id) REFERENCES policies (policy_id));CREATE TABLE policy_property (

policy_id         int,

property_address  varchar(20),

-- // other attributes specific to property insurance ...

FOREIGN KEY (policy_id) REFERENCES policies (policy_id));

该解决方案解决了其他两种设计中发现的问题:强制属性可以强制执行NOT NULL。

添加新子类型需要添加新表而不是向现有表添加列。

没有为特定子类型设置不适当属性的风险。

不需要type属性。

现在,公共属性不再与子类型特定属性混合。

我们终于可以保持干爽。创建表时,无需为每个子类型表重复公共属性。

管理id策略的自动递增变得更容易,因为这可以由基表处理,而不是每个子类表独立生成它们。

现在,无论子类型如何搜索所有策略都变得非常简单:不需要UNION- 只需要一个SELECT * FROM policies。

我认为类表方法在大多数情况下是最合适的。

mysql 表继承_如何在数据库中表示继承?相关推荐

  1. 下载行政区划mysql表设计_行政区划数据数据库的设计(脚本)

    /************************************************************* Author:   LzmTW(水如烟) Create date: 200 ...

  2. 抽奖活动mysql表设计_购物商城数据库设计-商品表设计

    大家好,今天我们来设计一下购物商城的商品表. 我们的目标是表结构能够满足下面这张图的搜索: 在设计表之前,我们先来了解下商品中的两个概念:SPU和SKU SPU SPU(Standard Produc ...

  3. sql如何把一个数据库的表复制到另一个数据库中【转载】

    sql如何把一个数据库的表复制到另一个数据库中[转载] 这篇经验帖是我转载的,是我搜到的最为直观具体的 一.需要把一张表的表结构从一个数据(A)库复制到另一个数据库(B).操作步奏如下: ①在数据库A ...

  4. oracle语句mysql数据库名称_查询oracle数据库中当前数据库所有表的名称

    SQL查询数据库中所有指定类型的字段名称和所在的表名 --查询数据库中所有指定类型的字段名称和所在的表名 --eg: 下面查的是当前数据库中 所有字段类型为 nvarchar(max) 的字段名和表名 ...

  5. mysql中删除数据库中的表格数据恢复_恢复从数据库中删除的表

    恢复从数据库中删除的表Recover tables deleted from a database 09/25/2018 本文内容 本主题演示如何创建一个示例 Visual Basic for App ...

  6. 在mysql中如何建立性别约束_在Access2010数据库中,要在表中建立“性别”字段,并按与要求用逻辑值表示,其数据类型应当是()_学小易找答案...

    [填空题]在Access2010数据库中,表结构的设计和维护是在表的()视图中完成的. [单选题]在Access2010数据库的下列字段类型中,字段大小不固定的是() [单选题]对Access2010 ...

  7. php mysql 到表最后_如何在PHP中获取MySQL表的最后插入ID?

    如何在PHP中获取MySQL表的最后插入ID? 我有一张表,经常插入新数据. 我需要获取表格的最后一个ID. 我怎样才能做到这一点? 它类似于SELECT MAX(id) FROM table吗? g ...

  8. hibernate mysql 外键_如何在hibernate中设置关联会在数据库中生成外键

    hibernate学习笔记(三) hibernate的一些杂记:1.sessionFactory的用法:SessionFactory是线程安全的,构造 SessionFactory 很消耗资源sess ...

  9. mysql表前缀_关于数据库表前缀的认识

    mysql数据库表前缀,这个是我们区分其它表的一个方式,当我们同一个数据库中含有多个系统的的时候,表前缀就却分的唯一标识.我们使用php开源程序安装建站的时候,一般数据库表前缀都是默认设置好的,如:w ...

  10. 管理mysql表知识点_数据库复习提纲(必考知识点整理)

    第1章 绪论 1 数据:数据是数据库中存储的基本对象. 数据库(DB):是长期存储在计算机内.有组织的.可共享的大量数据的集合. 数据库管理系统(DBMS):提供数据定义语言(DDL),用户通过它可以 ...

最新文章

  1. Tomcat端口被占用:starting Tomcat8.0 server at localhost has encountered a problem
  2. DNS中的七大资源记录介绍
  3. 开源项目工时系统_SpringBoot 微信点餐开源系统!综合运用项目,值得一看!
  4. python向钉钉发送本地文件_Python实现向钉钉群发送消息通知
  5. linux安装sz rz_超级好用的文件传输命令rz与sz
  6. SQL敲了mySQL变了_MySQL-Front肿么导出SQL文件
  7. 自定义播放器 winform
  8. Mac电脑共享“公共文件夹”以外的文件夹的设置教程
  9. UDK+VS2008搭建空工程
  10. 计算机程序c语言教材,C语言程序设计(高等学校计算机基础教育教材精选)
  11. 怎么在云服务器上建网站_如何在云服务器上部署自己的网站?
  12. 人工智能行业每日必读(01·17)
  13. 程序员的理想与现实,过于真实。
  14. 全站最全面的Python 基础入门必备知识大全,学完即就业!【建议收藏仔细学习】
  15. 观视界Grandvision EDI项目案例
  16. 安裝wgt文件失败[-1205]:WGT安装包中manifest.json文件的version版本不匹配
  17. Subtext v2.0 定制化开发之上传文件File Upload管理
  18. 两种查看电脑连接的wifi密码的办法!
  19. 图像处理:大小调整(tf.image.resize_images)
  20. Redis-三种特殊的数据类型-geospatial

热门文章

  1. 【CVPR-2019】基于深度学习优化光照的暗光图像增强
  2. Unity3D--学习太空射击游戏制作(二)
  3. python输出完全平方数_Python: 打印完全平方数
  4. 手机网络 G、E、H、H+、4G 都是什么意思
  5. 破解计算机win7管理员密码,教你win7旗舰版怎么破密码
  6. 二、C++反作弊对抗实战 (进阶篇 —— 10.利用硬件断点 + 结构化异常VEH HOOK与对抗方法)
  7. 北方果蔬谋定三链重构-农业大健康·随秀富:功能性农业理念
  8. JUC学习之共享模型之工具上之线程池浅学
  9. 图像去雾去雨去模糊去噪
  10. iOS-苹果官方开源网站;objc、Runloop、GCD、OC等开源代码