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:任何关于你怎么做的提示都会有帮助。非常感谢。我会尽量坚持你的解决方案。但是,每次创建新类型的车辆时,都需要更新查询。但我想没有办法避免这样的事情。有趣的方法。这样,我就不需要执行多个查询,也不需要在每次创建新类型时更新查询。我也会尝试一下:)非常感谢!!!