Sql 在Rails中设置DB表

Sql 在Rails中设置DB表,sql,ruby-on-rails,database,schema,Sql,Ruby On Rails,Database,Schema,我正在尝试使用Ruby/Rails设置以下基础设施。为了解释我的问题,这里用我试图建立的表格进行类比: 假设我有3个主要项目要建模/表示为表格:零件、制造商和汽车。因此,零件表包含所有独特的零部件,每个零部件都由制造商制造。制造商表包含制造零件的所有唯一制造商。Cars表包含所有独特的汽车。汽车是由零件组成的,制造商制造许多零件。我能用来表示这些信息的最有效的表结构是什么?我希望能够查询给定品牌汽车中的所有零件以及零件的制造商。我是DBs的新手,也是Rails的新手,因此我想了解我在顺利实现这一

我正在尝试使用Ruby/Rails设置以下基础设施。为了解释我的问题,这里用我试图建立的表格进行类比:
假设我有3个主要项目要建模/表示为表格:零件、制造商和汽车。因此,零件表包含所有独特的零部件,每个零部件都由制造商制造。制造商表包含制造零件的所有唯一制造商。Cars表包含所有独特的汽车。汽车是由零件组成的,制造商制造许多零件。我能用来表示这些信息的最有效的表结构是什么?我希望能够查询给定品牌汽车中的所有零件以及零件的制造商。我是DBs的新手,也是Rails的新手,因此我想了解我在顺利实现这一目标方面有哪些选择。

部分属于:制造商
,并且
有许多:汽车

汽车
有很多零件

制造商“”有许多零件


有关如何设置的详细说明,请阅读。

如果我正确理解您的问题:

  • 制造商制造许多不同类型的零件,但每种类型的零件仅由一个制造商制造

  • 一辆汽车包含多种类型的零件,一种类型的零件可以用于多种类型的汽车

  • 对于给定类型的汽车,您想知道哪个制造商为该汽车制造零件

  • 在这种情况下,可以在制造商、零件和车型之间建立以下关联:

  • 制造商和零件之间的“一对多”(1:M)关联。(向manufacturer.rb添加
    有多个:零件,并且
    属于:manufacturer
    到part.rb。)

  • 零件和汽车之间的“多对多”(M:M)关联。(将
    has\u和\u-belishing\u添加到\u-many:cars
    到part.rb,将
    has\u和\u-belishing\u添加到\u-many:parts
    到car.rb。)

  • 一个“有很多:通过”的协会,从汽车到零件再到制造商。(将
    添加到car.rb中有许多:制造商,通过::parts

  • 然后,使用迁移为每个模型创建一个表

    对于制造商和零件之间的1:M关联,零件表中应该有一列名为
    manufacturer\u id
    。每个零件的制造商id(或“外键”)是一个整数,等于制造商表中特定制造商的
    id
    (或“主键”)。换句话说,该零件“属于”该制造商。许多其他零件也可能属于该制造商

    对于零件和汽车之间的M:M关联,您需要创建一个附加表(),该表包含名为
    parts\u id
    cars\u id
    的列。这称为“连接表”。如果零件X包含在汽车Y中,连接表将有一行,其中零件id等于X,汽车id等于Y。这样,一个零件可以有许多汽车,反之亦然

    汽车和制造商之间的联系是间接的。一辆汽车可以有许多部件,而这些部件中的每一个都属于制造商。因此,一辆汽车可以有许多制造商

    还有一件事:对于M:M关联,您可以使用双面
    has\u many:to
    来代替双面
    has\u many:to
    。无论哪种方式,关联都需要三个表(零件、汽车和将它们连接在一起的表)。我不会进入HMT和HABTM之间的所有或中间。我认为底线是,“has_和_属于_-many”更简单,但“has_-many:through”会让你的应用程序更灵活,尤其是以后

    --根据评论进行编辑--

    每个表自动包含一个名为
    id
    的整数列。这就是所谓的。因此,无需将
    part\u id
    添加到parts表中,
    manufacturer\u id
    添加到manufacturers表中,等等

    但是,由于制造商和零件之间存在一个外键,因此零件表将需要一个外键,
    manufacturer\u id
    。如果零件属于制造商,则零件表中该零件行的外键必须等于制造商表中该制造商行的主键

    请注意,许多外键可以指向同一个主键,但反之亦然

    有点不同。cars表和parts表都不需要外键。相反,必须有第三个表,其中包含名为
    car\u id
    part\u id
    的外键列

    零件表不需要
    制造商名称
    列。制造商名称将位于制造商表中名为
    name
    的列中。您可以通过遵循零件与其制造商之间的关联来获得它。例如,如果
    @my\u part
    是表示某个零件的Ruby对象,则
    @my\u part.manufacturer
    将提供该零件的制造商,而
    @my\u part.manufacturer.name
    将提供该零件的制造商名称

    显示信息本身就是另一个主题!可以这样说,您可以创建一个表示id为X的汽车所有部件的对象,如下所示:
    @parts\u for\u this\u car=Part.where(car\u id:X)


    然后,这个车的对象@parts\u将是一个数组(具体地说,是一个Part对象数组)。在控制器操作中创建此对象(如controllers/car_controller.rb中的
    def show
    ),您可以在相应的视图文件(如views/cars/show.html.erb)中使用它。

    Hi,第1点和第2点正确,但第3点:对于给定的汽车,我希望能够列出其组成的所有零件。在part schema中,我将有part ID、part name、manufacturer\u ID、manufacturer\u name和其他一些字段。在manufacturer模式中,我将有manufacturer\u id、manufacturer\u name和一些其他杂项字段。在车里,我想要一辆ca