title: Should I avoid multi-table (concrete) inheritance in Django by any means?
body: <p>Many experienced developers recommend against using <a href="https://docs.djangoproject.com/en/1.5/topics/db/models/#multi-table-inheritance" rel="noreferrer">Django multi-table inheritance</a> because of its poor performance:</p>
  
  <ol>
  <li><p><a href="http://jacobian.org/writing/concrete-inheritance/" rel="noreferrer">Django gotcha: concrete inheritance</a> by <a href="http://jacobian.org/" rel="noreferrer">Jacob Kaplan-Moss</a>, a core contributor of Django.</p>
  
  <blockquote>
    <p>In nearly every case, abstract inheritance is a better approach for
    the long term. I’ve seen more than few sites crushed under the load
    introduced by concrete inheritance, so I’d strongly suggest that
    Django users approach any use of concrete inheritance with a large
    dose of skepticism.</p>
  </blockquote></li>
  <li><p><a href="https://rads.stackoverflow.com/amzn/click/com/1481879707" rel="noreferrer" rel="nofollow noreferrer">Two Scoops of Django</a> by <a href="http://pydanny.com/" rel="noreferrer">Daniel Greenfield</a> (<a href="https://stackoverflow.com/users/93270/pydanny">@pydanny</a>)</p>
  
  <blockquote>
    <p>Multi-table inheritance, sometimes called “concrete inheritance,” is
    considered by the authors and many other developers to be a bad thing.
    We strongly recommend against using it.</p>
    
    <p>At all costs, everyone should avoid multi-table inheritance
    since it adds both confusion and substantial overhead.
    Instead of multi-table inheritance, use explicit OneToOneFields and
    ForeignKeys between models so you can control when joins are
    traversed.</p>
  </blockquote></li>
  </ol>
  
  <p>But without multi-table inheritance, I can't easily</p>
  
  <ol>
  <li><p><a href="https://stackoverflow.com/questions/23555478/django-onetoonefield-to-multiple-models">Reference base model in another model</a> (have to use GenericForeignKey or reverse dependency);</p></li>
  <li><p><a href="https://stackoverflow.com/questions/1729784/django-get-all-implementations-of-an-abstract-base-class">Get all instances of base model</a>.</p>
  
  <p><em>(feel free to add more)</em></p></li>
  </ol>
  
  <p>So what is wrong with this kind of inheritance in Django? Why are explicit OneToOneFields better?</p>
  
  <p>How much does performance suffer from JOINs? Are there any benchmarks that show the difference in performance?</p>
  
  <p><s>Does not <code>select_related()</code> allow us to control when JOINs are invoked?</s></p>
  
  <hr>
  
  <p>I have moved concrete examples to a <a href="https://stackoverflow.com/questions/23555478/django-onetoonefield-to-multiple-models">separate question</a> since this one is becoming too broad, and added a list of reasons for using multi-table inheritance instead.</p>