数据建模:车辆的年份,品牌和型号?

时间:2011-03-30 23:59:24

标签: mysql database database-design data-modeling

我正在尝试在基本级别上对车辆进行建模。以下是我看到数据的方式:

  • “年”(例如2010年,2011年)有0个或更多“制造”(例如日产,本田)
  • “make”有0个或更多“模特”(例如日产有Sentra,Altima,Maxima)

有一个只包含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  

5 个答案:

答案 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
  • 你应该怎么称呼?列?
  • “Yaris”和“IS 350”属于 同一栏?
  • “IS”和“350”属于两个不同的栏目吗?
  • 您如何处理不适用于所有型号的列?

抵制诱惑,在这样的数据上抛出少量的id号码。首先确定密钥和功能依赖性。根据键和依赖项进行规范化。

答案 1 :(得分:0)

如果我理解正确,您需要创建一个make表和一个model表。 model表格包含idmake_idnameyear的列。

显然,make_id将是指向make表的外键。

这实际上取决于您的情况以及将数据标准化所需的数量。

答案 2 :(得分:0)

IMO,我多年来都不会做桌子。在整数列(例如年份)上执行SQL非常快,特别是在正确的索引到位的情况下。比加入快得多。

但是,我确实看到了为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主键,这些也是真正的主键。您可能希望将主键更改为唯一键,以确保数据一致性并将引用外键更改为整数。