2012-04-08 16 views
10

Yani hepimiz biliyoruz ki rayların STI'sı (tekli tablo kalıtım) icky olduğundan, karmaşık bir veri modeline ve en alt veri tabanına yol açmaktadır. Ancak PostgreSQL mirasını oldukça güzel bir şekilde ele alıyor gibi görünüyor!PostgreSQL miras mı?

Ağrılı geniş tablolar ve "tip" sütunlar yerine Postgres mirasını kullanırken rayların güzel temiz STI API'sini almanın bir yolu var mı?

+1

"Hepimiz biliyoruz ki rayların STI'sı (tekli tablo devralma), karmaşık bir veri modeline ve alt veritabanı veritabanına yol açtığı için icky." --- Bu önermeyi kabul etmiyorum. –

+0

Tamam belki de bu bir genelleme olabilir .. Ama çocuk modellerinizin diğer çocuklara uygulanmayan çok fazla özelliği olmadığı zaman sadece iyi bir fikir olma eğilimindedir. Aksi halde büyük çaplı geniş masalarla sonuçlanırsınız. null sütunlar. Bir raylar perspektifinden tamam olabilir, ancak veritabanında ham SQL'i çalıştırırken çok çirkin olabilir, belki de PostgreSQL'in mirası daha hızlı değil ama en azından benden uzak durur! : P –

+0

Postgres'in mirasları o kadar kusursuz bir şekilde uyuyorsa, sadece bir "tip" sütununun yeterince iyi olacağını düşünmüyorum. Miras ile gördüğüm kadarıyla, 'SELECT *' tüm ilişkili sütunları döndürür (ve ben de tüm ilişkisiz sütunları tahmin ediyorum:/... Ama DB yapınız daha temiz olurdu. – stuartc

cevap

3

Kısacası - hayır şu anda başarmaya çalıştığınız şey için güzel bir temiz STI API'si yok.

Ben aslında yaklaşık bir yıl önce bu a içine baktı ve çeşitli nedenlerden dolayı iyi bir fikir olmadığını bir sonuca vardık:

  1. Eğer PostgreSQL özgü özellikleri kullanmak istiyorsanız - temelde kendini evleniyorsun o DB'ye. Beni yanlış anlamayın PostgreSQL harika bir DB'dir ve birkaç kez kullandım, ancak bu DB ve uygulama tasarımında sıkışmış olacaksınız.
  2. Büyük olasılıkla DB'ye özgü özellikleri kullanmaya başlarsanız, bunları manuel olarak (DB üzerinde bir tür komut çalıştırarak veya GUI kullanarak) veya çalıştırırken çalıştırmanız gereken bir tür komut dosyası yazarak bitirirsiniz. db: migrate (uygun test yapmak istiyorsanız bunu yapmanız gerekecektir). Bir süre sonra, hantal ve sinir bozucu olur.
  3. Eğer daha daha rahatsız olduğunu fark ederseniz, size teklif "acı geniş tabloları ve 'o zaman tip' sütunlar":
    • Masanız tasarımı yeniden düşünüldü ve
    • Kişisel modellerini yeniden yapılması gerekmektedir STI
    • için iyi bir aday olmayabilir. Sadece bununla yaşamak zorundasınız.

Çoğu BT sorunları gerçekten bu kadar inmesi: Benefit vs Çaba. Senin durumunda

kendinize bu soruyu sormalısınız:

  • ne kadar zaman sadece ham SQL sorgusu hızlandırır eğer birkaç saniye daha iyi bir STI yapıyı uygulama üzerinde harcamak istiyoruz ? Belki daha açık bir SQL sorgusu yazmak daha iyidir? Çoğu uygulama, gerçekten bir sorun haline geldiği boyutlara ulaşmaz. Ama senin durumunda farklı olabilir.

PS: Ayrıca

uygulamanızda STI yapılandırılmasına ilişkin hızlı bir ipucu: Eğer tüm miras bir ProductCategory, CommentCategory, PhoneCategory, ClientCategory gibi STI kullanmak modelleri bir sürü var olduğunu görürseniz Cateogory'den - Bunları, model dizininin içindeki klasörlerde düzenlemeye eğilimliyim. Sonra application.rb içinde sadece bir satır ekleyin: config.autoload_paths += Dir[Rails.root.join('app', 'models', '{**/**}')]

+1

Ne zaman hiç kursta var kariyer anahtarı üretim veritabanı motorları?: P Ben büyük boy şirketler hakkında konuşuyorum, sizin HS arkadaşlarınızla başladığınız "başlangıç" değil ve CEO'sunuz ve o sizin CTO'dur. – Volte

+0

Doğru ve Evet, evet, normalde üretim uygulamasını o kadar çok değiştirmiyorsunuz, aksi taktirde, Twitter & Facbook, akla ilk gelen örneklerdir.Yeni bir kursta yeni bir süreye geçtiniz. - Bana birkaç kez oldu.İç uygulamaları eski eski kurulumlardan geçirmek zorunda kaldım: – konung

+0

@bwicklund - iyi soru, ActiveRecord (Rails) PostgreSQL ve STI hakkındaydı ve eğer bir Bunu işlemek için GÜZEL TEMİZ yolu - ve cevap basit durumlar dışında STI işlemek için güzel bir temiz yol yoktu ve nedenini açıkladı. Sadece cevabı sevmediğin için yanlış anlamadığı anlamına gelmez. Daha iyi bir açıklamanız varsa kendi cevabınızı vermekten çekinmeyin. – konung

6

Ancak PostgreSQL oldukça güzel miras işlemek gibi görünüyor!

Gerçekten mi?small print in the manual'a yakından baktınız mı? Örneğin:

  • Benzersiz kısıtlamaları (ve dolayısıyla da birincil anahtarlar) kalıtım düzeyleri üzerinde değil mümkündür.
  • Devralınan tablolara ve taban tablonun referansları karıştırılmaz. Yani (kılavuzdan kabaca alınır): capitals, cities'u uzatır. address tablonuz cities referansını almak istiyor. Bu olabilir. Ancak capital numaralı adres kullanılamaz.

Bu iki şey küçük bir "Merhaba Dünya" projesi dışındaki herhangi bir şeyle çok önemlidir. Bu yüzden, PostgreSQL mirasını kullanarak üretken bir şeyin uygulanabileceğini hayal bile edemiyorum.

+1

Aslında, anladığım kadarıyla masaya takmak için oldukça kullanışlıdır. Ancak, model-alan mirası için uygun olduğu doğrudur. – Divide

+0

Çoğu durumda masa takozu bile mümkün değildir: Birden fazla benzersiz kısıtınız varsa vidalanırsınız. Çoğu çerçevenin bir vekil anahtarı kullanması nedeniyle, bu, uygulama verileri için tek bir benzersiz kısıtlamaya sahip olamayacağınız anlamına gelir. –

+0

Tabii ki, vekil anahtarları kullanıyorsanız, sivriltmek çoğu zaman daha da zorlaşır. Psql docs'ın iyi bir örnekleme örneği var: http://www.postgresql.org/docs/9.1/static/ddl-partitioning.html – Divide