Mysql 数据库设计:与汽车相关';是模型还是装饰?

Mysql 数据库设计:与汽车相关';是模型还是装饰?,mysql,database,data-modeling,database-design,Mysql,Database,Data Modeling,Database Design,我在问一个以前在这里被删除的问题,因为它不是一个“编程问题”。希望这篇文章比上一篇文章更“编程” 首先,有几个定义: 车型-2011日产Sentra 内饰-2011日产Sentra LX 通常,一辆特定的汽车会有一个列表,比如说,可用的颜色或设备选项。因此,2011日产Sentra可能提供以下颜色: 黑色的 白色的 红色的 然后,制造商可能只为2011日产Sentra LX饰件提供了一种特殊颜色: 粉红色带黄色圆点 如果我正在建立一个汽车网站,我想在其中获取这些信息,我应该做以下哪项

我在问一个以前在这里被删除的问题,因为它不是一个“编程问题”。希望这篇文章比上一篇文章更“编程”

首先,有几个定义:

  • 车型-
    2011日产Sentra
  • 内饰-
    2011日产Sentra LX
通常,一辆特定的汽车会有一个列表,比如说,可用的颜色或设备选项。因此,
2011日产Sentra
可能提供以下颜色:

  • 黑色的
  • 白色的
  • 红色的
然后,制造商可能只为
2011日产Sentra LX
饰件提供了一种特殊颜色:

  • 粉红色带黄色圆点
如果我正在建立一个汽车网站,我想在其中获取这些信息,我应该做以下哪项:

  • 将颜色与模型关联
  • 将颜色与修剪关联
  • 是否将颜色与模型和修剪关联
我的直觉是,将它与模型联系起来就足够了。与内饰关联意味着重复(例如,2011年日产Sentra LX和2011年日产Sentre SE的颜色均为“黑色”)。尝试将颜色与模型和修剪相关联可能是过分的


建议?

您缺少修剪与模型的关联;如果没有这一点,我不知道您是否能够真正正确地完成关联。

如果同一型号的不同饰件可能有不同的颜色选项(如您所暗示的),那么您应该将颜色与饰件关联,否则您将有不正确/不兼容的信息。aka如果“粉色带黄色圆点”与“2011日产Sentra”车型关联,则您将错误地将其显示为除LX以外的饰件选项。

如果有特殊情况,如您所说,制造商仅为特定饰件提供了特殊颜色,如“粉色带黄色圆点”用于“2011日产Sentra LX内饰”

如果要存储这些特殊情况,应选择第二个选项

因此,您的关系将是:

1.制造商生产多种型号

1型号有许多饰件

1个饰件可以有多种颜色,1个颜色的饰件可以有多种颜色
(因此,您需要一个用于此关系的关联表)

有关颜色的其他信息:

一种通用颜色可以由不同的制造商和制造商命名为多种颜色 一个制造商可以用不同的颜色(名称)来“洗礼”一般颜色


更清楚地考虑,不需要额外的
制造商颜色关系:

Manufacturer
    1\
      \
       \N               
     Model                 GeneralColour
       1\                     1/
         \                    /
          \N                 /M
         Trim           Colour
           1\           1/
             \          /
              \N       /M
              TrimColour

应我对我的评论的要求

我只想让“颜色”成为一个自由格式的文本字段,可能带有一个预先填充的下拉列表,显示数据库中当前流行的颜色。它的主要优点是,它使您的DB模式更加简单,并使您的车型/颜色研究人员不会发疯。但它也允许制造商根本无法提供的定制喷漆作业

manufacturers
-------------
id

models
------
id
manufacturer (FK to manufacturers.id)
model_name   (VARCHAR)

trims
-----
id
model  (FK to models.id)

cars
-------
id
trim   (FK to trims.id)
year   INT
color  VARCHAR
如果我正在建立一个汽车网站,我想在其中捕捉这一点 信息

然后,您必须构建一个逻辑模型来捕获这些信息。(这有多难?)这意味着你必须对这些事实进行建模

  • 有些颜色适用于模型
  • 一些颜色适用于装饰包
  • (我敢打赌我能找到一家制造商,在那里一些颜色适用于 品牌。)
  • (我敢打赌,所有这些颜色都与年份有关。)
捕获所有已知需求是一回事。实施它们是另一个问题。一旦你了解了颜色是如何工作的

  • 你可以自由地忽略任何你想要的真实行为
但是,正如人们常说的那样

  • “当你选择行为时,你选择后果。”
简化已知需求——忽略某些颜色仅适用于一个或两个修剪包的事实——意味着您将数据库设计为故意允许无效数据。您的数据库最终可能会显示“粉色加黄色圆点”日产Altima或“铜色”日产Sentra的信息。(我认为日产在2004年引入了铜。)

这才是真正的问题

  • 您能容忍多少不良数据?

这始终取决于应用程序。与销售修补漆的公司相比,收集汽车颜色信息的社交媒体网站更能容忍不可能的颜色选择。

我会将颜色设置为自由格式字段,并在UI中预先填充常见选择。我想大多数汽车网站都是这样做的。它的主要优点是,它使您的DB模式更加简单,并使您的车型/颜色研究人员不会发疯。但它也允许制造商根本不提供的自定义喷漆作业。您可以推荐一个模型吗?模型可以有0个或更多修剪。这个部分已经建模了。@StackOverflowNewbie:你完全把这个关系从你的问题中漏掉了,这对答案产生了很大的影响。我认为99%的情况下,颜色与模型有关。在尝试捕捉特定饰件的颜色时,将“粉色带黄色圆点”显示给非2011日产Sentra LX的饰件是否很糟糕?@StackOverflowNewbie:如果您不介意使用不精确的模型,请继续选择第一个选项(将颜色与模型关联)。如果您只有一个显示信息的站点/数据库,则差别不大。但是,如果客户可以从您的网站/数据库订购汽车,那么他可能会订购您无法提供的东西。ypercube-如果我不希望用户潜在订购无法提供的东西(例如。
Manufacturer
    1\
      \
       \N               
     Model                 GeneralColour
       1\                     1/
         \                    /
          \N                 /M
         Trim           Colour
           1\           1/
             \          /
              \N       /M
              TrimColour
manufacturers
-------------
id

models
------
id
manufacturer (FK to manufacturers.id)
model_name   (VARCHAR)

trims
-----
id
model  (FK to models.id)

cars
-------
id
trim   (FK to trims.id)
year   INT
color  VARCHAR