PHP / MySQL Recursive Yorumlar Uygulanması

6 Cevap php

Ben insanların diğer yorumlar yorum yapabilirsiniz bir yorum sistemi, yazmaya çalışıyorum, ve bu sayfada özyinelemeli parçacığı olarak görüntülenir. (Reddit's sistemi yorumlarında Ben başarmak için çalışıyorum ne bir örnektir), ancak çok yavaş ve hesaplama pahalı olmaz böyle bir sistemi uygulamak için nasıl karıştı.

Ben her açıklama bir açıklama tablosunda saklanan olacağını hayal ve başka yoruma bir yabancı anahtar olacak bir parent_id içerir. Benim sorunum herkes en iyi bu nasıl uygulanacağı konusunda herhangi bir fikir var mı sorguları bir ton olmadan bu verilerin tüm almak için, ve sonra ne kadar verimli içeri düzene yorumları âit düzenlemek için nasıl gelir?

6 Cevap

Iç içe bir dizi modelini kullanmayı deneyin. Bu Managing Hierarchical Data in MySQL 'de tarif edilmektedir.

Büyük yararı alt düğümleri almak için özyineleme kullanmak zorunda kalmamasıdır, ve sorguları oldukça açıktır. Dezavantajı ekleme ve silme biraz daha fazla iş alır olmasıdır.

O da gerçekten iyi ölçekler. Ben bu yöntemi kullanarak tartışma hiyerarşileri saklayan biri son derece büyük bir sistem biliyor.

İşte another site sağlayan bu yönteme bilgileri + bazı kaynak kodu bulunuyor.

It's just a suggestion, but since I'm facing the same problem right now, How about add a sequence field (int), and a depth field in the comments table, and update it as new comments are inserted.

The sequence field would serve the purpose of ordering the comments. And the depth field would indicates the recursion level of the comment.

Kullanıcıların yeni yorum eklemek Sonra zor kısmı doğru güncellemeleri yapmak olacaktır.

I don't know yet how hard this is to implement, but I'm pretty sure once implemented, we will have a performance gain over nested model based solutions.

Ben özyinelemeli yaklaşımın arkasındaki temel kavramları açıklayan küçük bir öğretici yarattı. Insanlar yukarıda söylediğim gibi, özyinelemeli fonksiyon ancak, uçlar çok daha verimli, hem de ölçek değildir.

İşte bağlantılar:

http://www.evanpetersen.com/index.php/item/php-and-mysql-recursion.html

ve

http://www.evanpetersen.com/index.php/item/php-mysql-revisited.html

Çocuk sistemi - Ben normalde bir ebeveyn ile çalışır.

Örneğin, aşağıdakileri dikkate alın:

Table comment( commentID, pageID, userID, comment [, parentID] )

parentID (NULL olabilir) isteğe bağlıdır (aynı tablodan) commentID bir yabancı anahtardır.

Seçmek için yorumlar 'ana' Yorumlarınız için kullanabilirsiniz:

SELECT * FROM comments WHERE pageID=:pageid AND parentID IS NULL

Ve bir çocuk için bu:

SELECT * FROM comments WHERE pageID=:pageid AND parentID=:parentid

I had to implement recursive comments too. I broke my head with nested model, let me explain why :

Let's say you want comments for an article. Let's call root comments the comments directly attached to this article. Let's calls reply comments the comments that are an answer to another comment.

I noticed ( unfortunately ) that I wanted the root comments to be ordered by date desc, BUT I wanted the reply comments to be ordered date asc !! Paradoxal !!

Yani iç içe geçmiş modeli bana sorgu sayısını hafifletmeye yardımcı olmadı.

İşte benim çözüm:

Aşağıdaki alanlar a comment tablo oluşturun:

id
article_id
parent_id (nullable)
date_creation
email
whateverYouLike
sequence
depth

The 3 key fields of this implementation are parent_id, sequence and depth. parent_id and depth helps to insert new nodes.

Dizisi gerçek anahtar alandır, bu tür modeli emülasyonunu iç içe oluyor.

Each time you insert a new root comment, it is multiple of x. I choose x=1000, which basically means that I can have 1000 maximum nested comments (That' s the only drawback I found for this system, but this limit can easily be modified, it's enough for my needs now).

En son kök comment büyük sıra numarası ile biri olmak zorundadır.

Now reply comments : we have two cases : reply for a root comment, or reply for a reply comment.

In both cases the algoritm is the same : take the parent's sequence, and retrieve one to get your sequence number. Then you have to update the sequences numbers which are below the parent's sequence and above the base sequence, which is the sequence of the root comment just below the root comment concerned.

I don't expect you to understand all this since I'm not a very good explainer, but I hope it may give you new ideas. ( At least it worked for me better than nested model would= less requests which is the real goal ).