timhwang21.gitbook.io
  • Intro
  • Blog
    • 2023
    • 2022
    • 2021
    • 2020
    • 2019
  • CLI
    • Git
      • Bulk resolve merge conflicts
      • git rebase-onto
      • Patch from diff
    • Shell
      • Recipes
    • Vim
      • Batch editing
      • Buffers
      • <Ctrl-r>
      • External commands
      • :global
      • Help
      • Registers
      • Splits
    • Tools
  • Programming
    • React
      • Testing Styled Components
    • Typescript
      • curryRecord
      • Exhaustive conditionals with ADTs
      • newtype
      • OmitTypes
      • Safe JSON clone
      • Type inferrers
      • XOR type
    • Ruby
      • Pry
      • RSpec
    • Rails
      • Attributes
      • Cheap many to many
      • (Don't use) counter cache
    • Databases
      • Metrics
      • Testing indexes
  • Personal
    • Uses
    • Github
    • Medium
    • LinkedIn
    • Photography
Powered by GitBook
On this page
  • Downsides
  • Advantages
  1. Programming
  2. Rails

Cheap many to many

There are two common ways to establish a many-to-many relationship:

  1. has_and_belongs_to_many

  2. has_many, :through

Both require a join table, and the second requires a little more setup than the first bit is more future-proof.

A third alternative is so simple it sounds dumb: simply add a JSON column to the parent that contains an array of child IDs. If you understand the constraints of this approach and your use case doesn't need them, it can be a flexible and noncommittal way to model relationships.

Downsides

  • No guarantee of data integrity (can have orphaned IDs, no dependent: destroy, etc.).

  • Cannot access list of parents from child (can't see who a model belongs to).

  • Worse performance (or, at least, unmanaged performance).

Advantages

  • Very noncommittal. When working with uncertainty, it's good to be as flexible as possible until you are sure of requirements. Creating a table is very committal.

  • Automatic transactions. Simply update the parent record without needing to worry about data inconsistency.

  • Can easily migrate to a true join-table based relationship.

PreviousAttributesNext(Don't use) counter cache

Last updated 3 years ago