首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >数据库设计汽车.模型/汽车分类

数据库设计汽车.模型/汽车分类
EN

Database Administration用户
提问于 2013-02-19 12:40:01
回答 1查看 4.5K关注 0票数 5

我正在为经典汽车开发一个数据库。我不知道如何设计它的最佳方法。有几个特点的汽车,如如果它有2或4门,如果它是4x4或4x2,发动机容量1.6或2.0。

所有这些功能是独特的汽车,但他们必须被限制在什么模式有。因此,如果有人张贴自行车,例如,它将不会显示在下拉选项的4x4,或引擎以外的模型。

我不想把这个变成通用的。它只适用于汽车,所以没有必要考虑通用分类的最佳方式。

设计这个的最好方法是什么?

更多信息:

我的问题是如何设计汽车模型和实际汽车之间的关系。例如,示范年可以从1990-2000年开始。当有人要添加一个车型的汽车,我只想让他们能够选择的选项,模型有。如何将其存储在数据库中?

EN

回答 1

Database Administration用户

回答已采纳

发布于 2013-02-19 17:17:48

也许是这样的:

代码语言:javascript
运行
复制
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年可用于凯美瑞:

代码语言:javascript
运行
复制
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);

我们在我的工作中保存了一些关于汽车购买者的数据,在选择汽车类型时(无论是目前拥有的还是打算购买的),我们让他们选择一年,然后再做,然后模型和选择从下降。每个下拉列表都是根据先前的答案动态填充的。第一年:

代码语言:javascript
运行
复制
SELECT DISTINCT year_num FROM model_year;

然后是make (你不能选择2013年的Pontiac ):

代码语言:javascript
运行
复制
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;

然后根据以下内容填充模型下拉列表:

代码语言:javascript
运行
复制
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;

你明白了吧。至于约束模型的其他选项,有几个选项,基于您想要的严格程度、您想要花费多少时间来管理它,以及您对汽车行业的了解程度。

由于所有汽车都有一种驱动类型和变速器,所以您可能需要将这些表分开,如下所示:

代码语言:javascript
运行
复制
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表,如下所示:

代码语言:javascript
运行
复制
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

我更喜欢第一种方法,因为您可以看到第二种方法固有的引用完整性的问题,另外,限制可用的选项更尴尬。上市汽车的列表可能如下:

代码语言:javascript
运行
复制
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)
);

如果这没有解决某个特定的特性,您认为只需添加一个注释即可。

票数 15
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/35022

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档