【问题标题】:multicolumn primary keys in railsrails中的多列主键
【发布时间】:2011-11-20 12:48:43
【问题描述】:

我正在尝试将桌面应用程序迁移到 Rails(也处理相当老式的现有数据库)。问题是我在一列中没有唯一的 ID,但它是一个表的三列来保证记录的唯一性。

鉴于我有三个表:

authors
  author_name,
  author_letter,
  author_nr1,
  author_nr2
  ...

titles
  titel_nr,
  titel_name,
  ...

author_titles
  titel_nr,
  author_letter,
  author_nr1,
  author_nr2

这里作者的“主键”由author_letter、author_nr1、author_nr2组成。

那么我是否需要一种多列主键才能使 Rails 关联正常工作?还是我走错了方向?

【问题讨论】:

    标签: ruby-on-rails database foreign-keys associations primary-key


    【解决方案1】:

    没有。主键是(如 rails 默认)记录的 ID。

    此外,您还可以设置唯一键,例如

        add_index :users, [:merchant_id, :email], unique: true
        add_index :users, [:merchant_id, :login], unique: true
    

    这会保护您的数据库。要捕捉 Rails 中的独特性,您需要写入模型:

      validates_uniqueness_of :email,    scope: :merchant_id
      validates_uniqueness_of :login,    scope: :merchant_id
    

    【讨论】:

      【解决方案2】:

      存在一个名为 composite_primary_keys 的 gem,它允许使用多个列构建主键。

      所以,是的,您可以使用多列主键。

      但是,如果您能够更改数据模型(并非总是如此),我建议为每个表添加一个列 ID,因为这将使您的生活更轻松(并且性能也更高)。

      [编辑]

      使用 Composite_primary_keys 的类定义如下所示

      class Author
        set_primary_keys :author_letter, :author_nr1, :author_nr2
        has_many :titles, :through => :author_title
      end
      
      class Title
        set_primary_key :title_nr
      end
      
      class AuthorTitle
        belongs_to :title, :foreign_key => :title_nr
        belongs_to :authori, :foreign_key => [:author_letter, :author_nr1, :author_nr2]
      end
      

      希望这会有所帮助。

      【讨论】:

      • 这是我在研究中遇到的,我会尝试一下。就我而言,不幸的是我无法更改数据模型...感谢您的提示。
      • 但实际上我想要拥有多列主键的唯一原因是能够将(在我的情况下为三个)列作为多对多关联的外键。在我的情况下,我真的需要它们吗?
      • 如果您无法更改数据模型,那么可以。没有其他办法。否则,您的关系将找不到正确的行。
      • 我编辑了我的答案,以展示如何使用复合主键 gem 处理 Rails 中的数据模型。
      • 我是否也必须在迁移/模式中设置多列键?谢谢你,这对我帮助很大!
      【解决方案3】:

      正如许多人所说:“如果你与 Rails 对抗,它会反击”。 真的尽量避免这种情况,如果您没有干净的数据模型,那么使用 Rails 会很痛苦。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-06-25
        • 1970-01-01
        • 1970-01-01
        • 2011-06-29
        • 2011-02-08
        • 1970-01-01
        • 2011-04-10
        相关资源
        最近更新 更多