Huzurlu bir hizmette sıralı liste kaynağını nasıl tasarlamalıyım?


11

Aynı sorunu tekrar tekrar yaşadım ve gerçekten en uygun olduğunu düşündüğüm bir çözüm bulamadım.

Bir uygulamada söyleyin, sıralı bir listeniz var ve kullanıcının bu siparişi sürükleyip bırakarak veya başka bir şeyle değiştirmesine izin veriyorsunuz. Siparişteki değişikliklerin devam etmesini istiyorsunuz. Bunu nasıl modellersiniz?

Sıralı bir liste kaynağının huzurlu bir hizmetini nasıl tasarlamalıyım?

Özellikle, dinlendirici bir kaynağın modelini listve itemmodelini nasıl tasarlamalıyım ? Gördüğüm en yaygın tasarım itembir orderveya positionmülke sahip varlıktır . Duyduğum başka bir yaklaşım, öğelerle ilgili iki bağlantılı bir listedir.

Veritabanına çok fazla yazmayan ve genellikle istemciler için güncellenmesi ve okunması hızlı olan bir yaklaşım nedir? Uç noktalar nasıl açıklanmalıdır?


Meraktan, sıralı bir listeyi özel olarak iade etmek neden önemlidir?
Adam Wells

Özel bir sipariş listesi kaynağı döndürmek için değil, sadece gerçek bir liste kaynağının bir parçası veya sadece örtülü olarak bir listenin parçası olabilir kaynak düzeni / pozisyonu devam arıyorum sanırım. Ben kullanıcı todos listesinde bir yapılacaklar sırasını değiştirmek için izin demek istiyorum. Ancak, siparişin önemli olduğu bir liste hala ne olursa olsun.
Bulamam

Yanıtlar:


14

Sıralı bir listeyi temsil etmek ilişkisel veritabanlarıyla ilgili zor problemlerden biridir. Liste üyeliği ilişkisine bir position özelliği eklemek, bunu yapmanın en yaygın yoludur, çünkü ORDER BY positionSQL sorgunuza ekleyerek sıralı listeyi kolayca alabileceğinizden ve ortalamanın başına konumun tamsayı yerine bir kayan nokta olduğunu varsayarsak, önceki ve sonraki liste üyesinin değerleri.

Bağlantıları yanlışlıkla tutarsız hale getirmek ve bunun yerine döngüsel bir grafik veya ağaç kullanmak kolay olduğundan, iki kez bağlantılı listeler kullanmaktan kaçınılmalıdır.

Ancak, RESTful API'leri ilişkisel veritabanlarının kısıtlamalarından muzdarip değildir. Bir konum özelliği gibi bir kesmek kullanmak yerine, doğal hissettiren bir şey yapabilirsiniz.

Listede yalnızca birkaç yüz öğeniz varsa, tüm listeyi bir istekte aktarın. [1, 2, 3, 4]Liste üyelerinin kimliğini yeniden sıralamak istediğimizi varsayarsak ,

POST /url/of/the/list
Content-type: application/json
...

[1, 2, 4, 3]

Arka uç daha sonra bunu kullandığınız veritabanı teknolojisine çevirebilir, ancak API kullanıcısının bu ayrıntıları dikkate alması gerekmez.

Liste büyükse ve öğeler genellikle ayrı ayrı istenirse, url'de bir dizine izin verebilirsiniz:

GET /page/7

HATEOAS'a giriyorsanız, kaynak genellikle bu şekilde tüketilirse yanıt, gezinmeyi kolaylaştırmak için önceki / sonraki bağlantıları içerebilir. Ancak, bu, veritabanınızın bu çift bağlantılı listeyi de içerdiği anlamına gelmez.

Liste çok büyükse veya / ArrayListgibi işlemleri açığa çıkarmak isteyebilirsiniz . Böyle bir çağrıyı hayal edebiliyoruminsertpushappend

POST /url/of/the/list?at=1357;mode=insert
...

description of the item to insert

Yeniden sıralama yaygın bir kullanım durumuysa ve yeniden sıralama hemen gerçekleştirilecekse, API'nizde uygun bir bitiş noktası sunabilirsiniz:

POST /url/of/the/list/reorder-item?from=783;to=1357

Yeniden sıralanan listenin açıkça işlenmesi gerekiyorsa, yeni siparişi JSON belgesi olarak aktarmak daha kolay olacaktır, yukarıya bakın.

Artık API'nizi kullandığınız veritabanı teknolojisinden tamamen ayrı olarak görüntüleyebileceğiniz doğru değil. Ancak, harici API'yi uygulama ayrıntılarından mümkün olduğunca ücretsiz tutmak en iyisidir. Herhangi bir yeniden sıralama yalnızca bir tamsayı sipariş sütununu güncellemek için yaklaşık 30 satıra dokunursa, bu önemli değildir. Sadece mümkün olan en basit şeyi yapın ve her zaman tüm listeyi güncelleyin. Ölçeğiniz, veritabanı kullanımınızın daha karmaşık olmasını gerektiriyorsa, tutarlılığı korumanın daha kolay olduğu arka uçta bu karmaşıklığı yakalamayı tercih edin.


1
Değişiklik yapan birden fazla istemci varsa "listenin tamamını değiştir" yaklaşımının sorun yaratabileceğini unutmayın. Herhangi bir önlem almazsanız, bir başkasının değişikliklerinin üzerine yazabilirsiniz ("en son kazanan kazanır").
oefe

Liste benzeri işlemler, (at, from, to) parametrelerinin liste dizinleri değil ids olması şartıyla bu soruna sahip olmamalıdır
oefe

2

Farklı yaklaşımların uygulanabilirliğinin büyük ölçüde kullanılan temel veritabanına bağlı olduğunu düşünüyorum.

Bu yaklaşım, bir öğeyi siparişte taşımayı önerdi:

/ List / reorder-item? Den = 783; = = 1357'ye POST / url /

SERİLEŞTİRİLEBİLİR işlemliliğiniz yoksa bu yarış koşullarına tabi olabilir. Çoğu DB'deki varsayılan READ_COMMITTED düzeyi bir yarış koşulunu ortadan kaldırmaz!

Aslında, çoğu durumda - liste nispeten küçük olduğu sürece - tam liste yerine koyma yaklaşımının yarış koşullarıyla ilgili daha az sorunu olduğunu ve verileri bozamayacağını düşünüyorum. İstemci isteği yaptıktan sonra öğe kümesi değiştiyse, bir 409 (Çakışma) döndürebilirsiniz.

Son yazma kazançlarından muzdariptir, ancak bu kelimenin tam anlamıyla HERHANGİ BİR api için geçerlidir. Hangi API'yi uygularsanız uygulayın, başka bir istemci sayfayı görüntülerken bir şeyi güncellemiş olabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.