2011-12-05 17 views
5

Tarifler dolu bir veritabanı var, her satırda bir tarif. Glutonsuz, Et yok, Kırmızı et, No Domuz, Hayvansız, Hızlı, Kolay, Düşük Yağ, Düşük Şeker, Düşük Kalorili gibi çeşitli özellikleri işaretlemek için her tarifi için bir dizi keyfi "bayrak" saklamalıyım Düşük Sodyum ve Düşük Karbonhidrat. Kullanıcıların, kullanıcı arayüzünde onay kutularını işaretleyerek, bir veya daha fazla bayrak içeren tarifleri arayabilmesi gerekir.Postgres'te bir sıra için rastgele bir dizi boole değeri depolamanın en iyi yolu nedir?

Bu özellikleri Recipes tablosunda saklamanın en iyi yolunu arıyorum. Şu ana kadarki fikirlerim:

  1. Her özellik için ayrı bir sütun hazırlayın ve bu sütunların her birinde bir dizin oluşturun. Bu özelliklerin yaklaşık 20'sinden fazlasına sahip olabilirim, bu yüzden tek bir tabloda BOOL sütunlarının bir demetini oluşturarak herhangi bir sakınca olup olmadığını merak ediyorum.
  2. Tüm özellikler için bir bit maskesi kullanın ve her şeyi uygun bit sayısını içeren tek bir sayısal sütunda depolayın. Her bitte ayrı bir dizin oluşturun böylece aramalar hızlı olacaktır.
  3. Her etiket için bir değer içeren bir ENUM oluşturun ve ardından bu ENUM türünde bir ARRAY olan bir sütun oluşturun. Bir dizi sütununda HERHANGİ bir yan tümcenin bir INDEX kullanabileceğine inanıyorum, ancak bunu hiç yapmadım.
  4. Etiketlerden bire çok fazla tarifin eşlemesi olan ayrı bir tablo oluşturun. Her etiket bu tabloda bir satır olacaktır. Tablo, reçete için bir bağlantı ve bu tarif için etiketin "açık" olduğu bir ENUM değeri içerir. Sorgulama yaparken, bu etiketlerden en az birini içermeyen tarifleri filtrelemek için iç içe bir SELECT yapmam gerekir. Bunu yapmanın daha "normal" yolu olduğunu düşünüyorum, ama bazı sorguları daha karmaşık hale getiriyor - 100 tarif için sorgulamak ve tüm etiketlerini görüntülemek istiyorsanız, INNER JOIN kullanmalı ve konsolide etmek zorundayım. satırları veya yuvalanmış bir SELECT kullanın ve anında topluca kullanın.

Bir arka uç işlemi tarafından yemek tarifleri eklendiğinden ve arama hızının kritik olmasından dolayı (sonuçta birkaç yüz bin yemek tarifi olabilir) yazma performansı çok fazla önemli değildir. Sık sık yeni etiketler ekleyeceğime şüphem var ama en azından baş ağrısız olmak için mümkün olmasını istiyorum.

Teşekkürler!

cevap

4

Normalleştirilmiş bir kurulum kullanmanızı tavsiye ederim. Bunu, normalleştirilmemiş bir yapı olarak gitmekten vazgeçirmek, benim önereceğim şey değil.

Yaptıklarının tüm ayrıntılarını bilmeden, en iyi kurulumun reçete masanıza ve yeni özellik tablonuza ve yeni bir recipe_property tablosuna sahip olacağını düşünüyorum. Bu, bir tarifin 0 veya daha fazla özelliğe sahip olmasını ve verilerinizi normalleştirmesini ve verilerinizi korumak ve sorgulamak için hızlı ve kolay olmasını sağlar.

Yüksek seviyeli yapısı olacaktır: kesinlikle bir rota var

CREATE TABLE recipe(recipe_id); 
CREATE TABLE property(property_id); 
CREATE TABLE recipe_property(recipe_property_id,recipe_id,property_id); 
+0

Evet. Ayrıca, 'property_id' yerine bir 'ENUM 'kullanılmasını ve' property' tablosunun kullanılmamasını da düşünüyorum. Yine de, veritabanında dahili olarak sahip olduğunuzla aynı şeydir. –

+0

Sadece son çözümün sizi bir köşeye boyamayacağından emin olun. – Kuberchaun

+1

Birçok uzmandan aynı tavsiyeyi aldıktan sonra normalize rotayı bitirdim. Ancak kısa bir süre Postgres için 'hstore' modülüne baktım; ancak bu özel durum için kullanmamayı seçtim. –

İlgili konular