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

Lui*_*lez 5 database-design

我正在为汽车分类开发一个数据库。我不确定如何设计它的最佳方式。汽车有几个特点,比如它有 2 个或 4 个门,如果它是 4x4 或 4x2,发动机容量为 1.6 或 2.0。

所有这些功能都是汽车特有的,但它们必须仅限于该型号所具有的功能。因此,例如,如果有人发布自行车,则不会在 4x4 或该型号以外的引擎的下拉列表中显示该选项。

我不想让这个通用。它只会用于汽车,因此没有必要考虑如何最好地用于通用分类广告。

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

更多信息:

我的问题是如何设计汽车模型和实际汽车之间的关系。例如,模特年可以从 1990 年到 2000 年。当有人要添加该型号的汽车时,我只希望他们能够从该型号的选项中进行选择。如何将其存储在数据库中?

mdo*_*yle 13

也许是这样的:

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');
Run Code Online (Sandbox Code Playgroud)

要允许某人添加 2005 Toyota Camry,首先您需要确保 Toyota 在make表中,Camry 在model表中,并且 2005 可用于 Camry:

INSERT INTO make (make_id, make_name)
VALUES (1, 'Toyota');

INSERT INTO model (model_id, model_name)
VALUES (1, 1, 'Camry');

INSERT INTO model_year (model_id, year_num)
VALUES (1, 2005);
Run Code Online (Sandbox Code Playgroud)

我们在我的工作中保留有关购车者的某些数据,在选择汽车类型(当前拥有的或想要购买的)时,我们让他们从下拉列表中选择年份、制造商、型号和选项。每个下拉菜单都是根据以前的答案动态填充的。第一年:

SELECT DISTINCT year_num FROM model_year;
Run Code Online (Sandbox Code Playgroud)

然后是品牌(你不能为 2013 年选择庞蒂亚克):

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;
Run Code Online (Sandbox Code Playgroud)

然后模型下拉列表基于以下内容填充:

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;
Run Code Online (Sandbox Code Playgroud)

你明白了。至于限制模型的其他选项,有几个选项,这取决于您想要的严格程度、您想花多少时间管理它以及您对汽车行业的了解程度。

由于所有汽车都有驱动类型和变速箱,您可能需要制作这些单独的表格,例如:

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
);
Run Code Online (Sandbox Code Playgroud)

或者您可以使用选项表和模型选项表,如下所示:

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
Run Code Online (Sandbox Code Playgroud)

我更喜欢第一种方法,因为您可以看到第二种方法固有的参照完整性问题,而且限制可用选项变得更加尴尬。列出的汽车的表格可能是这样的:

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)
);
Run Code Online (Sandbox Code Playgroud)

如果这不能解决您认为只需要添加评论的特定功能。

  • 如果这是您正在寻找的内容,也许您可​​能会接受它作为答案。否则,如果需要更多内容,我会很乐意详细说明。 (4认同)