2013-02-09 5 views
1

je besoin de savoir quelle est la meilleure pratique pour stocker les données suivantes:Comment stocker et interroger des données différentes

Disons que je garages plusieurs, chaque garage possède différents types de véhicules avec des attributs totalement différents (par exemple des avions , tanks, bateaux, vélos). Je dois interroger tous les véhicules dans un garage, y compris leurs attributs.

Quelle serait une bonne pratique pour stocker et interroger ces données avec une requête universelle? Stocker tous les véhicules dans une table, avec tous les attributs possibles? Ou créer plusieurs tables, chacune pour un type de véhicule spécifique? Alors, comment puis-je interroger tous les véhicules d'un garage, sans savoir de quel type ils sont?

Est-ce que quelque chose comme ceci est possible avec une seule requête? Ou dois-je créer plusieurs requêtes pour obtenir les données?

J'espère que vous comprenez ce que j'essaie d'atteindre.

+2

Je pense que ceci est plus adapté à un tutoriel de base de données relationnelle qu'à un format Q et A de débordement de pile. Essayez [celui-ci] (http://www3.ntu.edu.sg/home/ehchua/programming/sql/Relational_Database_Design.html) et voyez comment vous allez. –

+0

Aucune des options que vous avez suggérées n'est la bonne façon de procéder. Si je peux penser à un bon moyen de le faire, je répondrai à la question, à moins que quelqu'un d'autre ne le fasse en premier. –

+0

Thx Garry -.- ... – user1713862

Répondre

1

Ceci est sûr possible, mais il implique une certaine planification lors de la création de votre modèle de données.

Comme nous l'avons déjà mentionné, il existe différentes manières d'implémenter des relations de type super-type (Héritage).

1.) Dans un tableau

Dans ce cas, je modélise votre problème un peu comme ceci:

Garage(GarageId_PK, Name) 
Vehicle(VehicleId_PK, LicenceNr, GarageId_FK, SomethingOnlyCarsHave, SoemthingOnlyMortorbikesHave, Type) 

Pour le type que vous pouvez donner cartes d'identité et avoir une table séparée où vous reliez les identifiants aux noms ou écrivez simplement les noms là (pas une solution très propre!). Btw .: Si vous voulez avoir plusieurs héritages (dont je suppose que vous n'avez pas besoin pour les véhicules), vous pouvez également faire un masque de type.

Personnellement, je n'aime pas vraiment cette approche, mais il est tout à fait correct de le faire. Oracle, par exemple, le suggère dans son matériel d'étude. En outre, il est la solution plus simple pour votre un problème de requête:

SELECT * 
FROM Vehicle v 
INNER JOIN Type t ON (v.Type = t.TypeId) 
WHERE GarageId = 42 

2.) Tableau pour chaque Sous-type

Pour moi, cela se sent comme la solution plus propre, parce que vous avez des valeurs moins NULL, mais vous besoin d'un peu plus de travail pour tout obtenir en une seule requête.Cela permet théoriquement l'héritage multiple et vous devriez écrire un déclencheur permettant uniquement le sous-type.

SQL dans ce cas:

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 

Ou si vous avez plusieurs types vous pouvez mettre les choses laides dans une vue:

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 

EDIT:

Un mot sur notation: Quand je mets _PK derrière un nom, il se réfère à la colonne étant une clé primaire. _FK à une clé étrangère.

+0

Merci beaucoup. Je vais essayer de rester avec votre solution. Cependant, il nécessite de mettre à jour la requête chaque fois qu'un nouveau type de véhicule est créé. Mais je suppose qu'il n'y a aucun moyen d'éviter quelque chose comme ça. – user1713862

0

Vous pouvez avoir un modèle qui ressemble

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) 
); 
0

Vous pouvez stocker tous les garages possibles est un garage de table séparée. Puis stocker tous les véhicules avec toutes les combinaisons possibles dans le tableau Véhicules . Dans le tableau de véhicule ajouter une colonne clé étrangère qui fait référence

create table vehicle(column1,column2...,garageid foreign key references garage) 

ensuite pour sélectionner tous les véhicules dans un garage, vous pouvez interroger la table du véhicule

select * from vehicle where garage='garage_value' 
1

je ferais quelque chose comme ceci:

Tableau garage - garageid, nom, d'autres choses

Tableau véhicule - VehicleID, VehicleTypeId, d'autres choses

Tableau VehicleType - VehicleTypeId, type, d'autres choses

Tableau Attribut - AttributeId, AttributeName, d'autres choses

Tableau VehicleAttribute VehicleID, AttibuteId, valeur d'autres choses

Tableau VehicleGarage - VehicleID, GarageId, DateIn, DateDeSortie, d'autres choses

requête pour obtenir tous les véhicules et les attributs dans un garage

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 

Pour les tables, d'autres choses seraient des choses comme CreatedWhen, CreatedBy et des choses comme ça.

+0

Approche intéressante. De cette façon, je n'aurais pas besoin de faire plusieurs requêtes ou de mettre à jour ma requête chaque fois qu'un nouveau type est créé. Je vais essayer aussi :) Merci beaucoup !!! – user1713862

Questions connexes