我正在为经典汽车开发一个数据库。我不知道如何设计它的最佳方法。有几个特点的汽车,如如果它有2或4门,如果它是4x4或4x2,发动机容量1.6或2.0。
所有这些功能是独特的汽车,但他们必须被限制在什么模式有。因此,如果有人张贴自行车,例如,它将不会显示在下拉选项的4x4,或引擎以外的模型。
我不想把这个变成通用的。它只适用于汽车,所以没有必要考虑通用分类的最佳方式。
设计这个的最好方法是什么?
更多信息:
我的问题是如何设计汽车模型和实际汽车之间的关系。例如,示范年可以从1990-2000年开始。当有人要添加一个车型的汽车,我只想让他们能够选择的选项,模型有。如何将其存储在数据库中?
发布于 2013-02-19 17:17:48
也许是这样的:
CREATE TABLE make (
make_id INT NOT NULL,
make_name VARCHAR(25),
PRIMARY KEY(make_id);
);
CREATE TABLE model (
model_id NOT NULL,
make_id NOT NULL,
model_name VARCHAR(25),
PRIMARY KEY(model_id)
);
CREATE TABLE model_year (
model_id INT NOT NULL,
year_num INT NOT NULL,
PRIMARY KEY (model_id, year_num)
);
CREATE TABLE transmission (
transmission_id INT NOT NULL,
transmission_descrip VARCHAR(15),
PRIMARY KEY (transmission_id)
);
CREATE TABLE drive (
drive_id INT NOT NULL,
drive_descrip VARCHAR(10),
PRIMARY KEY (drive_id)
);
INSERT INTO transmission (transmission_id, transmission_descrip)
VALUES (1, 'Auto'), (2, '4-speed manual'), (3, '5-speed manual');
INSERT INTO drive (drive_id, drive_descrip)
VALUES (1, '2WD Front'), (2, '2WD Rear'), (3, '4WD'), (4, 'AWD');要允许某人添加2005年丰田凯美瑞,首先需要确保丰田在make表中,凯美瑞在model表中,2005年可用于凯美瑞:
INSERT INTO make (make_id, make_name)
VALUES (1, 'Toyota');
INSERT INTO model (model_id, make_id, model_name)
VALUES (1, 1, 'Camry');
INSERT INTO model_year (model_id, year_num)
VALUES (1, 2005);我们在我的工作中保存了一些关于汽车购买者的数据,在选择汽车类型时(无论是目前拥有的还是打算购买的),我们让他们选择一年,然后再做,然后模型和选择从下降。每个下拉列表都是根据先前的答案动态填充的。第一年:
SELECT DISTINCT year_num FROM model_year;然后是make (你不能选择2013年的Pontiac ):
SELECT DISTINCT m.make_id
FROM make m
INNER JOIN model mo ON mo.make_id = m.make_id
INNER JOIN model_year my ON my.model_id = mo.model_id
WHERE my.year_num = @some_year_variable;然后根据以下内容填充模型下拉列表:
SELECT DISTINCT model_id
FROM make m
INNER JOIN model mo ON mo.make_id = m.make_id
INNER JOIN model_year my ON my.model_id = mo.model_id
WHERE my.year_num = @some_year_variable
AND ma.make_id = @some_make_variable;你明白了吧。至于约束模型的其他选项,有几个选项,基于您想要的严格程度、您想要花费多少时间来管理它,以及您对汽车行业的了解程度。
由于所有汽车都有一种驱动类型和变速器,所以您可能需要将这些表分开,如下所示:
CREATE TABLE model_transmission (
model_id INT NOT NULL,
year_num INT NOT NULL, -- include this to restrict tranny based on some years
-- certain models had different trannies offered
transmission_id INT NOT NULL,
PRIMARY KEY (model_id, transmission_id) -- include year_num in PK if it is in the
-- table
);
CREATE TABLE model_drive (
model_id INT NOT NULL,
year_num INT NOT NULL, -- again, if you are up to this level of control
drive_id INT NOT NULL,
PRIMARY KEY (model_id, drive_id) --include year_num in PK if it is in the table
);或者您可以使用选项表和model_option表,如下所示:
CREATE TABLE option (
option_id INT NOT NULL,
option_descrip VARCHAR(25),
PRIMARY KEY (option_id)
);
INSERT INTO option (option_id, option_descrip)
VALUES (1, 'Transmission'), (2, 'Drive'), (3, 'Doors');
CREATE TABLE model_option (
model_id INT NOT NULL,
option_id INT NOT NULL,
option_value VARCHAR(15),
PRIMARY KEY (model_id, option_id) -- include year_num as above if desired
);
INSERT INTO model_option (model_id, option_id, option_value)
VALUES (1, 1, '1'), (1, 2, '1'), (1, 3, '4'); -- All Camrys now have automatic,
-- front-wheel drive, and 4-door options
-- available我更喜欢第一种方法,因为您可以看到第二种方法固有的引用完整性的问题,另外,限制可用的选项更尴尬。上市汽车的列表可能如下:
CREATE TABLE car (
listing_id INT NOT NULL,
year_num INT NOT NULL,
model_id INT NOT NULL,
transmission_id INT NOT NULL,
drive_id INT NOT NULL,
doors INT NOT NULL, -- might want varchar to include 'hatchback' or other options
mileage INT,
customer_id INT NOT NULL,
PRIMARY KEY (listing_id)
);如果这没有解决某个特定的特性,您认为只需添加一个注释即可。
https://dba.stackexchange.com/questions/35022
复制相似问题