我正在尝试在基本级别上对车辆进行建模。以下是我看到数据的方式:
有一个只包含1列的“年”表是没有意义的,所以我认为它将与“make”结合起来创建:
TABLE: year_make
- year
- make
我想“year”和“make”列会组成一个复合键。
然后我会有一个“模型”表,它以某种方式与“year_make”表相关联。问题是我不知道在“year_make”中放入“模型”来关联2个表。
我是否制作PK:year_make-> year_make_id并使用它?这意味着“year”和“make”列不再是复合键,对吧?
更新
我想我应该有一个查找表“lookup_make”,然后“year_make”会有一个“lookup_make_id”而不是“make”列。
更新2:
Per nate c:
TABLE: make
- make_id
- name
TABLE: model
- model_id
- make_id
- name
TABLE: model_year
- model_id
- year
答案 0 :(得分:4)
如果您创建一些示例数据,我认为您将更好地为设计做好准备。目标是提出代表样本数据。您可以从代表性样本数据中学到很多东西。 (如果您的样本数据不具代表性,您可以犯一些非常昂贵的错误。)
Year Make Model ?? ?????
--
2011 Honda Accord LX Sedan
2011 Honda Accord SE Sedan
2011 Honda Accord EX Coupe
2011 Toyota Yaris 3-door liftback
2011 Toyota Yaris Sedan
2011 Toyota Yaris 5-door liftback
2011 Lexus IS 350 Sedan
2011 Lexus IS 250 Sedan
抵制诱惑,在这样的数据上抛出少量的id号码。首先确定密钥和功能依赖性。根据键和依赖项进行规范化。
答案 1 :(得分:0)
如果我理解正确,您需要创建一个make
表和一个model
表。
model
表格包含id
,make_id
,name
,year
的列。
显然,make_id将是指向make
表的外键。
这实际上取决于您的情况以及将数据标准化所需的数量。
答案 2 :(得分:0)
但是,我确实看到了为Make创建一个单独的表并根据它进行连接的优点。这样您就可以输入制造商的详细信息,如历史,生产年限,网站等。
所以我会这样做:
Manufacturers: (or Makes)
- id
- name
- website
- country
Cars:
- manufacturer_id (or make_id)
- model
- year
- doors
- trim_class
答案 3 :(得分:0)
到目前为止看起来很好,就像你的想法一样。然而,在汽车表中,如果你必须进入凯美瑞2001,camry 2002 canry 2003,camree 2004.似乎你会有冗余数据以及拼写错误的数据完整性风险。 IMO你还需要一些带有makeID和modelID的Entity,使用modelID只输入一次或者只需在表中输入一次model。 '凯美瑞'将永远是'凯美瑞'代表modelID。
答案 4 :(得分:0)
在看了一些之后,我认为你可以将这一年的模型作为多对多的加入。我把两种方式都只是为了表明我正在谈论的内容。如果你有一个多年来涵盖整个模型的属性,如汽车类(经济,卡车,豪华等),你需要一个多对多的表进行规范化并避免数据重复。
-- id did not use auto-incs as I am just showing the relational model
create table make(
makename varchar primary key
);
-- 1. many to many
create table model(
modelname varchar not null,
makename varchar not null references make(makename),
-- if carclass changes - one update changes every model/year combo
carclass varchar not null -- economy, suv, truck etc ...
primary key (makename, modelname)
);
create table model_year(
year integer not null,
modelname varchar not null references model(modelname)
baseprice integer not null
primary key (year, modelname)
);
-- 2. year /w/ model
create table model(
modelname varchar not null,
makename varchar not null references make(makename),
year integer not null,
-- update anomaly - you would have to update every model/year combo
carclass varchar -- economy, suv, truck etc ...
-- baseprice is OK since it is tied to the year
baseprice integer not null
primary key (makename, modelname, year)
);
...所以#1将是更“正确”和强大的方式,特别是如果您计划在模型上保留与其生成年份无关的属性。无论哪种方式都会得到相同的查询。事实上,它的更难/更多的工作(并非真正在你得到它之后)加入规范化的表而不是非规范化的表。但这不是重点。您正在放入数据库,因为您希望数据正确(我希望)。
注意:即使您使用auto-inc主键,这些也是真正的主键。您可能希望将主键更改为唯一键,以确保数据一致性并将引用外键更改为整数。