【问题标题】:Inheritage code in SQLSQL 中的继承代码
【发布时间】:2017-01-15 21:33:15
【问题描述】:

我在编写 mySQL 时遇到问题。我已经为我的数据库制作了一个预期模型,但不知道如何将它应用到 mySQL 中。

我已经制作了一个vehicle的继承树作为我的超实体,它分为​​新旧车辆和子实体。此后将分为拖拉机、汽车等。所有子实体都具有相同的属性,例如品牌、电机功率等。

我对如何构建它有一个想法,但不知道如何对其进行编码。我能得到一些指导吗?

【问题讨论】:

  • 是将关系转换为 mysql 表,还是将概念方案(ER?、UML?)转换为关系?
  • 我有一个概念方案,我无法将其转换为关系到 mySQL 表中是的 :) 所以我的 vechilas 是新旧的 - 每个都包含拖拉机、林业机械和建筑机械车辆具有相同的属性,即品牌、生产年份、燃料、燃料消耗、电机功率

标签: mysql sql inheritance multiple-inheritance


【解决方案1】:

嗯 - 有几种方法可以在 DB 中实现概念方案;数据库课程通常会花费 10 张幻灯片来讨论这个主题,因此我无法在这里全部处理和讨论。但我做了一个应该适合的猜测:

我想一辆车要么是旧的,要么是新的,但不是两者兼而有之。

然后我会为车辆制作一张基表。 newold之间的区别是通过一个鉴别器属性isNew来完成的;正如您提到的多重继承,我假设车辆可以同时是拖拉机和林业机械;因此,我会为这些类型中的每一种放置一个单独的布尔指标:

create table vehicle (
  id int primary key,
  isNew bool not null,
  isTractor bool,
  isForestMachine bool,
  ...
  brand varchar(20),
  productionYear int,
  ...
);

如果车辆不能同时属于多种类型,则类型的单个鉴别器属性会更好:

create table vehicle (
  id int primary key,
  isNew bool not null,
  type ENUM('tractor', 'forest', 'construction'),
  brand varchar(20),
  productionYear int,
  fuel int,
  fuelcon int,
  motorpower int);

【讨论】:

  • 车辆不能为同一类型。我正在创建的这个数据库是一个组成的。所以我有一家销售新旧机器的公司,我提供的是拖拉机、林业机械和建筑机械,所以我想展示的 DB 表是“旧/新机器,机器类型,然后是属性”。如果现在更有意义。我们在课堂上讨论了继承,但只讨论了如何在概念方案中编写它,而不是在数据库中。
  • 所以示例 2 应该适合您 - 请参阅编辑后的答案
  • 创建表车辆(id int 主键,isNew bool not null,type ENUM('tractor', 'forest', 'construction'),isold bool not null,type ENUM('tractor', 'forest', 'construction'), brand varchar(20), productionYear int,fuel int,fuelcon int,motorpower int);
  • 当我写这篇文章时,我收到一条错误消息“错误代码:1060。重复的列名'type' 0.062 sec”
  • 您输入了两次type ENUM ...。请参阅已编辑的答案,其中我接管了您的所有属性,删除了重复的 type 和属性 isOld(这是过时的,因为每辆不是 isNew 的车辆都自动旧。
【解决方案2】:

在进行面向对象的模型设计时,您通常会创建超类和子类。

例如,您可以创建一个名为vehicle 的超类。然后,您可能会创建继承自 vehicle 的类,我猜它们称为 roadVehicleoffroad。那么继承自roadVehicle 的类可能是car。 &C。等等。

当您为 MySQL(或 Oracle 或其他)这样的关系数据库管理系统布置表时,这种设计并不是很有帮助。为什么不?类继承在概念上不容易转化为数据库表。

因此,您需要一个表格,其中包含每种车辆的所有描述性属性。表格的每一行都描述了一辆汽车。

所以,你可能有列

  id             an autoincrementing id
  is_new         boolean.  true means new, false means used.
  make           "Volvo", "International Harvester", &c.
  model          "50D", "King Cab", etc.
  year           the model year of the machine text like "2001", "2015a"
  date_of_manufacture  a date field
  vehicle_type   a text string. "car", "log truck", "tractor", and so forth
  engine_type    a text string "diesel" "gasoline", "electric", "diesel-electric" &c.
  engine_power   75kW, etc. maybe a number if everything is in kW.
  number_of_wheels   4 for a car. 18 for a tractor-trailer, etc
  tool          text. blank for cars.  "Log grapple," maybe, for a log truck
  description   text.  "Staffan's old Citroen" for example.
  registration_locale   text.  SE, US, DE, etc.
  registration_number    text. ABC-123  etc.

你明白了。如果您想查看有关二手车的信息,请进行以下查询:

 SELECT * FROM vehicles WHERE is_new = 0 AND vehicle_type = 'car'

这样做的缺点是您必须在单个表中包含所有公共属性的列。汽车没有工具,所以你在浪费汽车的专栏。林业机械可能没有注册号,因此您在浪费该列。

不过没关系。这是一种构建数据库的简单且可维护的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-10
    • 2020-10-19
    相关资源
    最近更新 更多