2014-08-30 28 views
5

Bir MySQL veritabanında özyinelemeli bir üst-çocuk ilişkisini temsil etmek istiyorum. category - subcategory ilişkisini oluşturmak istiyorum. Bir kategori N alt kategorilere sahip olabilir ve bunların her biri N alt kategorisine vb. Sahip olabilir. Kendisine işaret eden yabancı bir tuşa sahip bir category tablosunu düşünmeyi düşünüyordum. Bir kategori bir üst düzey kategori ise SQL Veritabanı Tasarımı, öz-ebeveyn-çocuk ilişkisi?

CREATE TABLE `category` (
    `id` int NOT NULL AUTO_INCREMENT, 
    `name` varchar(50) NOT NULL, 
    `parent_category` int NULL, 
    PRIMARY KEY (`id`), 
    FOREIGN KEY (`parent_category`) REFERENCES `category` (`id`) 
) 

parent_category

boş olabilir: Burada ne demek budur.

Böyle bir ilişkiyi temsil etmenin doğru yolu bu mu? Tasarımımda göz önünde bulundurmam gereken başka şeyler var mı (performans, sorgular ...)?

+0

olası yinelenen [SQL -? Depolamak ve hiyerarşileri gezinmek için nasıl] (http://stackoverflow.com/questions/38801/sql -how-to-store-ve -ateate-hiyerarşileri) –

+2

MySQL'in sınırlı SQL özellikleri nedeniyle, MySQL'de bu şekilde yapmayacağım. Özyinelemeli sorguların eksikliği nedeniyle bu hiyerarşiden veri almak için gerçekten zor bir zamanınız olacaktır. MySQL ile uygulanabilecek farklı bir tasarım için "iç içe geçmiş model" araması yapın –

cevap

4

Verilerinizi nasıl kullanmak istediğinize ve güncelleme ve ekleme işlemleriyle ilgili sorguları tercih etmek istediğinize bağlıdır. Çözümünüze bitişik liste modeli denir ve verilerin eklenmesini veya güncellenmesini çok kolaylaştırır. Sınırsız bir kardeş derinliğiniz varsa sorgular karmaşık olabilir, ancak yine de bu veri yapısını nasıl kullanmayı planladığınıza bağlıdır. İstediğiniz tek şey, bir düğümün tüm kardeşlerini göstermekse, bu tamam. Öte yandan, tüm ağacın geliştiğini göstermek ve bunu bir sorguda yapmak istiyorsanız, baş ağrınız var demektir.

Hiyerarşinizi temsil eden birleştirilmiş bir dizeyi kullanmak başka bir çözüm olacaktır. Örneğin :

  1. Avrupa 1.1 Fransa 1.1.1 Paris 1.1.2 Marsilya
  2. Amerika Amerika 2.1 Amerika Birleşik Devletleri 2.1.1 Washington

DDL şey olurdu bunun gibi:

CREATE TABLE `category` (
    `id` int NOT NULL AUTO_INCREMENT, 
    `name` varchar(50) NOT NULL, 
    `link` varchar(30) NOT NULL DEFAULT '.', 
    PRIMARY KEY (`id`), 
) 

Bu veri yapısı, sorgularınızı kolaylaştırır, ancak güncelleştirmeler daha yavaştır

Başka bir çözüm, düğümün kimliğini, geçerli düğümün sağında ve solunda kaydettiğiniz iç içe geçmiş modeldir. Sorgular için en verimli yapıdır, ancak ekleme ve güncelleme daha zor hale getirir.

http://en.wikipedia.org/wiki/Nested_set_model

Ben ağaçlara size Joe Celko kitabını tavsiye ve hiyerarşiler arasında