Nasıl (yani herhangi bir jenerik grafiğinde) olmayan ağaç hiyerarşik verileri saklamak gerekir?

0 Cevap php

Ben PHP ile yazılmış bir site var. Şu anda (I ek DB teknolojilere açık değilim), veritabanı ihtiyaçları için MySQL kullanmaktadır.

Sistemin içeriği birbiriyle edilir. Bu ilişkiler vertices içerik parçalarıdır ve kenarları ilişkiler vardır grafik olarak temsil edilebilir. Bunu grafik hareket edebilmek gerekir. Özellikle ben edebilmek gerekir:

  • (Bir öğe kaç grandchildrean var örneğin) belirli bir derinlikte çocuk sayısını alın
  • (Örneğin, kaç çocuk ve torunları bir madde var) belirli bir derinlikte toplam çocuk sayısını alın
  • (Bu öğeden uzun yol örneğin budur) verilen bir kök için maksimum derinliği alın
  • (Bu maddenin torunları gibi) belli bir derinlikte çocukları alın
  • (Bu maddenin dedesi eg), belirli bir derinlikte anne alın
  • (Örneğin "gizli" veya "kilitli" gibi) durumları hangi Look up ebeveynlerden miras olmuştur.

Bir dinamik bir sistem üzerinde grafik ve bir ağaç veya geleneksel hiyerarşi olduğu için, ben think olağan SQL tabanlı hileler (örneğin komşuluk Listesi ve Yol Numaralama) ekarte bazı karışıklıklar vardır.

The Main Intricacies:

  • İçerik birden fazla çocuğu olabilir.

  • İçerik birden fazla ebeveyne sahip olabilir.

  • Bir öğenin ilişkisi grafiği her kullanıcı için farklı görünebilir. Örneğin, bazı içerik tek bir kişi değil, diğeri için gizli olabilir.

  • Öğeler bir grafik ağacın kez daha görünebilir ve farklı yol uzunlukları (aynı zamanda bir 3. nesil çocuk olurken, örneğin madde 50 acil bir çocuk olabilir) görünebilir.

  • Grafikler öğelerin yüzbinlerce içerebilir.

Some Additional Intricacies:

  • (, Anket bir forum sonrası ile ilgili olabilir gibi, ya da bir kullanıcı bir toplulukla ilgili olabilir) farklı içerik türleri ilişkili olabilir

  • (Ebeveyn / çocuk ilişkisi, mülkiyet ilişkisi, akran ilişki gibi) ilişki birkaç farklı türleri vardır

  • Ilişkinin türüne bağlı olarak, izinleri ve kısıtlamaları veya bir üst gizli örneğin eğer çocuk da gizli olacaktır (ebeveynden çocuğa geçti, ama olmayabilir bir eş öğesi durum birlikte geçti olmadığını gizliyse )

My Naive (slow) "Solutions"

Şu anda SQL kullanarak naif yaklaşım alıyorum. Ben bu sütunlar ile tek bir "İlişkiler" tablosu vardır:

item1ID (int)
item1TypeID (int)
item2ID (int)
item2TypeID (int)
relationshipTypeID (int)

PHP, dinamik iç benlik tam sorguları oluşturmak maksimum derinliği bakmak katılır, ve anladım bir kez o zaman ben gereken her türlü bilgi hiyerarşisini ve alır erişir tek bir sorgu oluşturmak. Bu bile uygun indeksleme ile, zaten çok yavaş.

Benim ikinci naif yaklaşım saklanan prosedürleri içine geçişi ve derinlik arama hareketli olacaktı. Bu aslında önemli bir hız artışı yaratacak, hiçbir fikrim yok. Ben de bu yüzden sık sık maksimum derinlikleri bakarak önlemek olabilir önbelleğe alma mekanizması çeşit içeren düşünüyordum, ama sadece gerçek sorunu önleme gibi görünüyor.

My Question

Daha iyi bir yolu olmalı. Bu nedir? Ben SQL hiyerarşik bilgi konu ile ilgili sorular ve cevaplar zaten StackOverflow bir yeri vardır biliyorum, ama bu oldukça hiyerarşi değil - bir tam şişmiş grafiktir.

Ben güçlü modelleri var beri mevcut kod tabanı bozmadan şeylerin ilişki tarafını işlemek için başka bir DB teknoloji karıştırabilirsiniz. Ben NoSQL çözümlere bakarak olmuştur ama ben onlar hakkında neredeyse hiçbir şey bilmiyoruz. Ben de isim ve gördüğüm çeşitli powerpoint slaytlar dayalı (örneğin Neo4J gibi) "Grafik Veritabanları", hangi duymuş, tam olarak neye ihtiyacım gibi geliyor. Ancak, olanlar aslında ayrılmamak için ya da olanlar PHP ile iyi oynamak hangi yeterince sağlam olduğu bilmiyorum.

StackOverflow bana yardımcı, sen benim tek umudumsun.

0 Cevap