2012-12-12 14 views
21

İlişkilerin çoğu zaman yalnızca bir tarafa erişildiği çoktan çoğa ilişkiyi modelliyorum. Daha çok bir hiyerarşi gibi, yukarıdan aşağıya erişilir ve diğer yoldan değil.Bağlantı tabloları vs yabancı anahtar dizileri?

Anketi vardır ve var birçok Sorular aittir ve birçok Cevapları aittir.

Her iki ilişki de çoktan çoğa olmalıdır, çünkü aynı soru farklı anketlerde ve aynı soruda birçok soruda tekrar kullanılabilir. Bu bir şarttır.

Standart M2M uygulaması, iki birleşim tabloları, surveys_questions ve questions_answers kullanır. Bunun yerine, PostgreSQL'in tamsayı dizilerini kullanarak, Ankette question_ids ve soruda answer_ids'u depolamayı düşünüyorum.

Yabancı anahtar dizisiyle eşleşen tüm satırları sorgulamak için HER operatörünü kullanabiliriz.

Tüm anketleri soruları ve sorularının yanıtlarını SQL kullanarak nasıl sorgularız?

Yabancı anahtar dizisiyle döndürülen satırların sırasını nasıl eşleştirebiliriz? yani. question_ids = [1,2,3] kullanarak soru satırlarını 1, 2, 3 numaralı sırayla döndürmesi garanti edilir.

Bu, bağlantı tablolarıyla karşılaştırıldığında performans açısından daha iyi performans gösterir (uygun indeksler varsa, her ne olursa olsun)?

Bunu önerir misiniz? M2M'yi bunun gibi modelleme konusunda bazı kaynaklar var mı?

Güncelleme

Orada PostgreSQL 9.3 için dizi yabancı anahtarlar için bilgi tutarlılığını eklemek için bir öneri, ama dahil alamadım: http://blog.2ndquadrant.com/postgresql-9-3-development-array-element-foreign-keys/

yabancı anahtar diziyi PostgreSQL JOIN with array type with array elements order, how to implement? kullanarak düzeni sağlamak konusunda SO soru

+0

Çok kişiye çok şey söylüyorsunuz, ancak bu bire çok gibi geliyor; Pek çok kişi, her bir anketin birkaç soruyla ilgili olduğu ve her sorunun birkaç anketle ilgili olduğu anlamına gelir, ama bu biraz garip geliyor, şüphesiz, '' birçoğunu '' ifadesi normalde bir ile birçokyla eşanlamlıdır. -many genellikle 'has -ve-aittir-çok' 'olarak adlandırılır) – SingleNegationElimination

+0

@TokenMacGuy: Karışıklık için özür dilerim. Sorular, çoktan çoğa ilişkileri kuran sorular arasında anketler ve cevaplar boyunca yeniden kullanılabilir. Değiştireceğim HABTM ile çok ilişkisi var. – randomguy

cevap

7

Bağlantı tablosu yaklaşımını kullanın. Dizi metodu standart dışıdır, ne kadar çalışacağı hakkında soru sormanız gerekir, diğeri ise tamamen standarttır.

+4

bağlantı tabloları, dizilerden önemli ölçüde daha yavaş olabilir. bkz. https://gist.github.com/joevandyk/031cf5812bd656887623 –

+0

Evet, bazen dizi yönteminden elde edilecek bir performans artışı var. Tabii ki tüm durumlara ayak uydurup tutamayacağı konusunda büyük bir soru var ve asıl sorunlardan biri, yeni bir link eklemek/çıkarmak, ekleme/silme yerine potansiyel olarak uzun bir satırda (örnekte kupon) bir değişiklik yapılmasını gerektirmesidir. tek bir satır ve kupon masasında bir kilit. –

+0

Anlaştık! Kupon tablosunu her ekte değiştirmek istemediyseniz, bunun yerine bir coupons_products_array tablosu (coupon_id, product_ids []) olabilir. Ama bu aptalca olabilir. –