Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何存储和查询不同的数据_Sql_Storage - Fatal编程技术网

Sql 如何存储和查询不同的数据

Sql 如何存储和查询不同的数据,sql,storage,Sql,Storage,我需要知道存储以下数据的最佳做法: 假设我有多个车库,每个车库拥有不同类型的车辆,具有完全不同的属性(例如飞机、坦克、轮船、自行车)。我需要查询一个车库中的所有车辆,包括它们的属性 使用一个通用查询来存储和查询这些数据的最佳做法是什么?是否将所有车辆存储在一个表中,以及每个可能的属性? 或者创建多个表,每个表针对特定类型的车辆?那么,如何查询一个车库中的所有不同车辆,而不知道它们是哪种类型 用一个查询就可以做到这一点吗?或者我必须创建多个查询才能获取数据 我希望你能理解我想要实现的目标。你可以拥

我需要知道存储以下数据的最佳做法:

假设我有多个车库,每个车库拥有不同类型的车辆,具有完全不同的属性(例如飞机、坦克、轮船、自行车)。我需要查询一个车库中的所有车辆,包括它们的属性

使用一个通用查询来存储和查询这些数据的最佳做法是什么?是否将所有车辆存储在一个表中,以及每个可能的属性? 或者创建多个表,每个表针对特定类型的车辆?那么,如何查询一个车库中的所有不同车辆,而不知道它们是哪种类型

用一个查询就可以做到这一点吗?或者我必须创建多个查询才能获取数据


我希望你能理解我想要实现的目标。

你可以拥有一个看起来

vehicle_type(vehicle_type_id, description, PK(vehicle_type_id));
 (1, 'bike'; 2, 'plane', ..etc);

vehicle(vehicle_id, vehicle_type_id (FK to  vehicle_type),
 [common attributes], PK(vehicle_id), 
  UNIQUE(vehicle_id,vehicle_type_id ) 
);

bike(vehicle_id,vehicle_type_id , [bike attributes], 
  PK(vehicle_id,vehicle_type_id),
  FK(vehicle_id,vehicle_type_id ) to vehicle, 
  CHECK(vehicle_type_id=1));

plane(vehicle_id,vehicle_type_id , [plane attributes], 
PK (vehicle_id,vehicle_type_id),
  FK(vehicle_id,vehicle_type_id ) to vehicle,
  CHECK(vehicle_type_id=2) 
);

garage(garage_id, name, ..., PK (garage_id));

garage_vehicle(garage_id - FK to garage, 
 vehicle_id - FK to vehicle, PK(garage_id,vehicle_id)
);
你可以把所有可能的车库都放在一个单独的桌子上。 然后将所有车辆以及所有可能的组合存储在车辆中 桌子在vehicle表中添加一个外键列,该列引用

然后,要选择单个车库中的所有车辆,可以查询车辆表

select * from vehicle where garage='garage_value'

这当然是可能的,但是在创建数据模型时需要进行一些规划

正如您已经提到的,有不同的方法来实现子类型-超类型关系(aka继承)

1.)一体式表格

在这种情况下,我会对您的问题进行如下建模:

Garage(GarageId_PK, Name)
Vehicle(VehicleId_PK, LicenceNr, GarageId_FK, SomethingOnlyCarsHave, SoemthingOnlyMortorbikesHave, Type)
对于该类型,您可以提供ID,并有一个单独的表,在其中您可以将ID与名称关联起来,或者只需在其中写入名称(这不是一个非常干净的解决方案!)。 顺便说一句:如果你想有多重继承(我想你不需要为车辆),你也可以做一个位掩码类型

就我个人而言,我并不喜欢这种方法,但这样做是可以的。Oracle i.e.在他们的研究材料中提出了这一点。此外,它也是解决单查询问题的更简单的解决方案:

SELECT *
FROM Vehicle v
INNER JOIN Type t ON (v.Type = t.TypeId)
WHERE GarageId = 42
每个子类型的表

对我来说,这感觉像是一个更干净的解决方案,因为空值更少,但需要做更多的工作才能在一个查询中获得所有内容

Garage(GarageId_PK, Name)
Vehicle(VehicleId_PK, LicenceNr, GarageId_FK)
Car(VechicleId_PK_FK, SomethingOnlyCarsHave)
Motorbike(VechicleId_PK_FK SoemthingOnlyMortorbikesHave)
理论上,这允许多重继承,您应该编写一个只允许子类型的触发器

SQL在本例中:

SELECT *
FROM Vehicles v
     LEFT JOIN Car c ON(v.VehicleId = c.VehicleId)
     LEFT JOIN Motorbike m ON (v.VehicleId = m.VehicleId)
WHERE GarageId = 42
或者如果你有更多的类型,你可以把丑陋的东西放到一个视图中:

CREATE OR REPLACE View v_allVehicles AS
(SELECT *
 FROM Vehicles v
      LEFT JOIN Car c ON(v.VehicleId = c.VehicleId)
      LEFT JOIN Motorbike m ON (v.VehicleId = m.VehicleId)

SELECT *
FROM v_allVehicles
编辑:


符号上的一个词:当我把_PK放在名称后面时,它指的是作为主键的列_FK到外键。

我会这样做:

Garage(GarageId_PK, Name)
Vehicle(VehicleId_PK, LicenceNr, GarageId_FK, SomethingOnlyCarsHave, SoemthingOnlyMortorbikesHave, Type)
表车库-车库ID、姓名、其他资料

表Vehicle–VehicleId、VehicleTypeId和其他内容

表VehicleType–VehicleTypeId、类型和其他内容

表属性–AttributeId、AttributeName、其他内容

表VehicleAttribute–VehicleId、AttibuteId、Value和其他内容

表VehicleGarage–车辆ID、车库ID、日期输入、日期输出、其他内容

查询以获取车库中的所有车辆和属性

select v.vehicleId
, vt.type
, a.attributename
, va.value
from VehicleGarage vg join Vehicle v on vg.VehicleId = v. VehicleId
join VehicleType vt on v.VehicleTypeId = vt.VehicleTypeId
join VehicleAttribute va on v.VehicleId = va.VehicleId
join Attribute a on va.AttributeId = a.AttributeId
where garageId = 1

对于表,其他内容可能是CreatedWhen、CreatedBy之类的东西。

我认为这比堆栈溢出Q和a格式更适合关系数据库教程。试着看看你进展如何。你建议的两个选择都不是办法。如果我能想出一个好办法,我会回答这个问题,除非有人先回答。@Dan:任何关于你怎么做的提示都会有帮助。非常感谢。我会尽量坚持你的解决方案。但是,每次创建新类型的车辆时,都需要更新查询。但我想没有办法避免这样的事情。有趣的方法。这样,我就不需要执行多个查询,也不需要在每次创建新类型时更新查询。我也会尝试一下:)非常感谢!!!