Database design 是否在数据库中存储年份/品牌/型号?

Database design 是否在数据库中存储年份/品牌/型号?,database-design,Database Design,以下是我的想法(请原谅Django格式): 这将在那些临时下拉选择框中使用,这些框的视觉布局类似于[-Year-][-Make-][-Model-]。因此,要查询我需要的数据,我首先必须从years表中选择所有不同的年份,按降序排序。然后我会找到当年生产车型的所有汽车制造商。然后是那一年生产的所有型号。这是一个很好的方法,还是我应该以某种方式重新安排外键?或者对年份/模型使用多对多表格,这样就不会重复年份了?我绝对不是专家,但我认为会是这样的 class VehicleModel( Model

以下是我的想法(请原谅Django格式):


这将在那些临时下拉选择框中使用,这些框的视觉布局类似于
[-Year-][-Make-][-Model-]
。因此,要查询我需要的数据,我首先必须从years表中选择所有不同的年份,按降序排序。然后我会找到当年生产车型的所有汽车制造商。然后是那一年生产的所有型号。这是一个很好的方法,还是我应该以某种方式重新安排外键?或者对年份/模型使用多对多表格,这样就不会重复年份了?

我绝对不是专家,但我认为会是这样的

class VehicleModel( Model ):
    name = CharField( max_length=50 )
    year = PositiveIntegerField()
    manufacturer = ForeignKey( VehicleManufacturer )

class VehicleManufacturer( Model ):
    name = CharField(max_length=50)

这一年不需要单独的类/表,直接插入即可。虽然我还没有考虑所有的可能性,你能告诉我这是否合适吗?

我可能过于简单化了,但是有一个简单的表格,里面有品牌、型号和年份,有什么错呢?是的,make字符串将在每一行中重复,但实际上-您希望该表中有多少行

class Vehicle( Model ):  
    name = CharField( max_length=50 )  
    year = PositiveIntegerField()  
    model = CharField( max_length=50 )  
我会选择:

  class VehicleModel( Model ): 
    name = CharField( max_length=50 ) 
    first-year = PositiveIntegerField()
    last-year = PositiveIntegerField() 
    make = ForeignKey( make ) 

class Make( Model ): 
    name = CharField(max_length=50) 
    manufacturer = ForeignKey( VehicleManufacturer ) 

class VehicleManufacturer( Model ): 
    name = CharField(max_length=50) 
这将允许您将别克、雪佛兰、凯迪拉克等归入“通用汽车”类别

而且我觉得你的UI逻辑有点缺陷, 这应该像一个“向右行走”菜单的工作,也就是说,你需要一个所有制造商的下拉列表,当选择一个特定的制造商时,你可以显示一个模型的子菜单,当选择一个模型时,你可以预设一个年份的子菜单

或者,无论何时选择新制造商,您都应该编辑“型号”选择的内容,然后无论何时选择型号,都应该更新年份选择


如前所述,您的用户界面允许我输入一个“Studebaker”“Model T”“2010”

为什么要这样使用年份?当您可以硬编码1920以后的代码时,您正在进行X数量的数据库往返。然后,在第一次访问服务器时,您可以使用当年发布的模型返回make。我知道这有点不相关,但如果可以的话,你也可以去掉数据库的负载。@rrhys:我该如何保存生产模型的年份?您想让我将年份字段移到
车辆模型
模型上吗?但我认为制造商每年都会发布同一型号的新版本。。。按照我的方式,我不必重复型号名称。+1当我得到新的答案时,我几乎准确地输入了这个:)嗯?我想你是在想,我希望“车辆”指的是车辆的一个特定实例,但我试图存储一些数据,以便他可以选择车辆。用你所拥有的<代码>车辆。名称是否指制造商?每行都会重复这个字符串?今年会是什么?年份应该是指汽车制造商生产特定车型的年份(复数)。我现在看到你的修订版了。。。尽管如此,我还是不得不重复它发布的每一年的型号名称。不知道我是怎么想的。我也在想这个。这是肯定的可能性。。。我还没有算过,但我预计实际会有几千行。有300家汽车制造商吗?(),他们每个人平均说有5种不同的型号,他们可能生产10年=300*5*10=15000行;这是一个公平的数字。@标记“是”,但除非您存储的是品牌、型号或年份的其他信息,否则这些信息中的每一个都是各自域的主键,Franci Penov的答案是正确的。将域拆分为不同的表仅在整型列小于char(50)列的意义上是有利的。。。。但这是一个过早的优化。@NobleShrasher:在输入所有数据时也可以防止输入错误:p如果品牌/型号差异甚至只有一个字母,那么当我运行我的
从车辆中选择不同的名称时,我将有重复的。也。。。我不知道“独特”有多贵。@马克,这是一个很好的观点。在任何情况下,我都会亲自把它们放在三个不同的表格中(我甚至有一张年表,我怀疑很多人可能会考虑浪费),但我的考虑有点不同。“马克,一个完整的解释太长了。可以说,有些人认为表是一组关系,并抱怨SQL不尊重关系模型,因为它允许重复或需要/鼓励主键。更有效的方法是将表视为搜索空间的边界(索引是该空间的收缩)。当您创建一个表时,您告诉数据库从哪里开始搜索以及搜索的距离(这就是为什么表不仅仅是一个真正的集合;它必须有一个顺序)。RDB设计中的所有内容都以这个概念为中心。欢迎致电PM。是的。。。这正是我所说的“偶然性下降”的意思。除了我希望他们先选择年份,过滤品牌,过滤模型。我不认为你的第一年/去年的逻辑是正确的,因为我很确定制造商喜欢跳过几年(我想到的是宝马5系)。。。我认为大多数车型确实在特定年份开始和停止。奇数球可以作为单独条目输入两次。减少了一两张桌子,避免了我在输入所有数据时自杀。。。
  class VehicleModel( Model ): 
    name = CharField( max_length=50 ) 
    first-year = PositiveIntegerField()
    last-year = PositiveIntegerField() 
    make = ForeignKey( make ) 

class Make( Model ): 
    name = CharField(max_length=50) 
    manufacturer = ForeignKey( VehicleManufacturer ) 

class VehicleManufacturer( Model ): 
    name = CharField(max_length=50)