我正在为汽车分类开发一个数据库。我不确定如何设计它的最佳方式。汽车有几个特点,比如它有 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)
如果这不能解决您认为只需要添加评论的特定功能。