Kongre neden DB tablo adlarının tekil ama RESTful kaynakları çoğul olması gerektiğini söylüyor?


27

En azından SQL'de veritabanı tablo adlarının tekil olması gerektiği oldukça yerleşik bir kuraldır. Bu soru ve tartışmayaSELECT * FROM user; bakın .

Aynı zamanda, RESTful API kaynak adlarının çoğul olması gerektiği konusunda çok eski bir kongredir. GET /users/123ve BunuPOST /users görün .

En basit veritabanı destekli API'de, URL'deki kaynağın adı tablo olur ve URL ile istek / yanıt gövdelerindeki veri öğeleri doğrudan DB'deki sütunlara eşlenir. Kavramsal olarak, bu teorik API üzerinden veri üzerinde çalışmak ile doğrudan SQL üzerinden çalışmak arasında bir fark görmüyorum. Ve bu nedenle, adlandırma kuralları arasındaki fark userve usersbenim için mantıklı değil.

Çoğullaştırmadaki fark kavramsal olarak REST API ve SQL aynı şeyi yaparken nasıl haklı görülebilir?


3
DB tablo adında ve herkesin takip ettiği RESTful kaynak adında tek bir kural yoktur . Aksine, birçok sözleşme olabilir. Bazılarının çatışması şaşırtıcı değil.
Eric King,

13
Böyle bir kongre yoktur. Her zaman çoğul tablo isimleri kullandım. kullanıcılar , hesaplar vb. o şeyden birden fazlasını tutuyorlar.
GrandmasterB

2
@GrandmasterB Sözleşme var ve “ilişkileri” (ilişkiler haline getirmeyen, tablolar haline gelen) tekil isimlere sahip olan Codd'un ilişkisel modelinde kökeni var çünkü ilişki birçok şeyin listesi olmayan şeylerin bir listesi. Her ilişki bir listedir. İlişkiler modeli etki alanı varlıkları. Varlıklar isimleri Codd'un ilişkisel modelinde tekildir. Var olmadığını söylemek için bol miktarda literatür var. Ama isterseniz çoğul isimler kullanmanız tamamen sorun değil.
Tulains Córdova

4
@ user61852 Kurallara uygun olarak kullanabilecek kişiler var. Ancak, hiçbir şekilde, bu soruda sunulan şekilde, camelCase veya MarkDown'ın olduğu gibi geniş bir şekilde takip edilen bir endüstri sözleşmesi değildir.
GrandmasterB

4
Ayrıca, REST'in bir veritabanı erişim protokolü olmadığını unutmayın. DB adlandırma kurallarının (hangisiyle birlikte gidersiniz) ve URL adlandırma kurallarının (hangisiyle birlikte gidersiniz) aynı olması gerektiği için hiçbir neden yoktur, birbirleriyle hiçbir şeyleri yoktur. İki çok farklı etki alanı. Veritabanlarının neden tekil kullandığını ve URL'lerin neden birden fazla kullandığını düşünmekten daha fazla anlam ifade etmiyor. Kötü tasarlanmış web çerçeveleri, REST'in DB erişimiyle bir ilgisi olduğunu düşünen insanlara sahipler, ancak değil.
Cormac Mulhall

Yanıtlar:


12

REST özelliği (hangi seviye ile gitmek isterseniz) veritabanı erişimi olarak tasarlanmamıştır. API erişimine standardizasyon getirmeye çalışıyor. Söz konusu SQL kuralları (kullanmak isteyip istemediğiniz), API erişimi göz önünde bulundurularak tasarlanmamıştır. SQL sorguları yazmak içindir.

Bu yüzden burada açılacak olan konu, bir API'nin doğrudan veritabanına eşleştiği kavramsal anlayıştır. Bunu en azından 2009 yılına kadar bir anti-patern olarak tanımlayabiliriz .

Bunun temel nedeni bu kadar kötü mü? "Bu işlem verilerimi nasıl etkiler?" Açıklayan kod. müşteri kodu olur .

Bunun API üzerinde oldukça korkunç etkileri var. (ayrıntılı bir liste değil)

API ile entegrasyonu zorlaştırır

Şunun gibi belgelenen yeni bir kullanıcı oluşturma adımlarını hayal ediyorum:

  1. POST /users { .. }
  2. POST /usersettings { .. } bazı varsayılan değerlerle
  3. POST /confirmemails { .. }

Fakat 2. adımdaki başarısızlığı nasıl ele alıyorsunuz? Bu aynı kullanım mantığı kopya-makarnanız API'nizin diğer müşterilerine kaç kez geliyor?

Bu veri işlemlerinin istemciden tek bir işlem olarak başlatılması sırasında sunucu tarafında sıralanması daha kolaydır. Örn POST /newusersetup. DBA'lar bunu saklı bir prosedür olarak tanıyabilir, ancak API işleminin sadece veritabanının ötesinde etkileri olabilir.

API'yi güvenceye almak umutsuzluğun bir kara deliği olur

İki kullanıcı hesabını birleştirmeniz gerektiğini varsayalım.

  1. GET /users/1
  2. PUT /users/2 { .. }
  3. DELETE /users/1

Kullanıcının silinmesine izin vermezken birleştirme özelliğine izin vermek için bir kullanıcı iznini nasıl oluşturacaksınız? Bir kullanıcıyı silmek, var DELETE /users/1olduğunda bile adil bir şekilde temsil ediliyor /usersettingsmu?

API işlemleri, sistemde birden fazla değişikliğe neden olabilecek daha yüksek (veritabanından daha) seviyeli işlemlere bakılmalıdır.

Bakım zorlaşıyor

... çünkü müşterileriniz veritabanı yapınıza bağlı.

Bu senaryodaki tecrübelerime dayanarak:

  • Mevcut tabloları / sütunları yeniden adlandıramaz veya kaldıramazsınız. İşlevleri için yanlış adlandırılmış olsalar bile veya artık kullanılmazlarsa bile. Müşteriler kırılacak.
  • Yeni özellikler mevcut veri yapılarını değiştiremez, bu yüzden verileri ve işlevselliği, mevcut bir özelliğe bütünsel olarak ait olsa bile yapay olarak ayrılır.
  • Kod temeli, parçalanma, kafa karıştırıcı isimler ve güvenli bir şekilde kaldırılamayan fazla bagaj nedeniyle anlaşılması zorlaşıyor.
  • Önemsiz değişiklikler hariç, tümü giderek daha riskli ve zaman alıcı hale geliyor.
  • Sistem durur ve sonunda değiştirilir.

Veri tabanı yapınızı doğrudan istemcilere maruz bırakmayın ... özellikle üzerinde geliştirme kontrolü olmayan istemcilere. İstemciyi yalnızca geçerli işlemlerle sınırlamak için bir API kullanın.

Yani bir API'yi sadece bir veritabanına doğrudan bir arayüz olarak kullanıyorsanız, çoğullaşma endişelerinizin en azıdır. Bir fırlatma deneyi dışında, API'nin temsil etmesi gereken daha yüksek seviyeli işlemleri belirlemek için biraz zaman geçirmenizi öneririm. Ve bu şekilde baktığınızda, çoğullaştırılmış API varlık adları ile tekil SQL varlık adları arasında bir çelişki yoktur. Farklı nedenlerden dolayı varlar.


1
Farklı bir soruyu cevaplar. OP, her iki bağlamda da bazı varlıkların sadece varlığı, API ve DB varlıklarının doğrudan ilişkilendirilmesi anlamına gelmez.
Basilevs 19

2
Sorulduğunu düşündüğünüz soruya cevap göndermekten çekinmeyin.
Kasey Speakman

4
@Basilevs Aslında bunun soruyu cevapladığını düşünüyorum. Bazen yanlış varsayımlar etrafında bir soru çerçevelendiğinde cevaplar dolaylı görünebilir. "Her iki bağlamlarda bazı kişilerin varlığı" bazı fakat başkalarıyla arasındaki 1'e 1 yazışmalar ima aynı kişilerdir ima eder. Bir API'nin karmaşık bir veri modeli üzerine böyle bir yazışması hatalı bir tasarım anlamına gelir.
Aluan Haddad,

Bunlar arasında Spring Data Rest'i kullanmayı bırakmamın birçok nedeni var.
Sebastiaan van den Broek

4

REST API ve SQL "aynı şeyi yapmıyor"

OP soruyor:

Çoğullaştırmadaki fark kavramsal olarak REST API ve SQL aynı şeyi yaparken nasıl haklı görülebilir?

Ah, ama çekirge, RESTful arayüzünün ve SQL tablolarının "aynı şeyi yaptığını" gösteriyor gibi görünebilir , ancak iyi programlama hijyeni bize her zaman REST API'si ve veritabanı arasında aracılık eden bir ara katman olduğunu söyler. Bu noktayı yok saymak, yazılım aydınlanmasına giden yoldan sapmaktır! :)

Böylece RESTful API'ler ve SQL tabloları, başka bir yerde iyi bir şekilde belgelendirilen ve ayrıntılı olarak tartışılan kendi deyimsel adlandırma kurallarını mutlu bir şekilde izleyebilir.

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.