Jestem na rozdrożu decydując, czy tagi powinny być ich własnym zasobem, czy zagnieżdżoną własnością notatki. To pytanie dotyczy nieco RESTful projektowania i przechowywania bazy danych.Czy tag powinien być jego własnym zasobem lub zagnieżdżoną własnością?
Kontekst: Mam zasób notatki. Użytkownicy mogą mieć wiele notatek. Każda notatka może mieć wiele znaczników.
Cele funkcjonalne: muszę tworzyć trasy, wykonaj następujące czynności:
1) Pobiera wszystkie tagi użytkowników. Coś jak: GET /users/:id/tags
2) Usuń znaczniki powiązane z notatką.
3) Dodaj znacznik do określonej notatki.
danych/Występ Gole
1) pobierania tagów użytkownik powinien być szybki. Ma to na celu "autosugest"/"autouzupełnianie".
2) Zapobiegaj duplikatom (w miarę możliwości). Chcę, aby znaczniki były ponownie wykorzystywane w największym możliwym stopniu w celu umożliwienia przesyłu danych według tagów. Na przykład chciałbym złagodzić scenariusze, w których użytkownik wpisuje tag, na przykład "superbohaterowie", gdy tag "superbohater" już istnieje.
takiej sytuacji, tak jak ja to widzę, istnieją dwa sposoby przechowywania tagi na zasób UWAGA:
1) Tagi jako zagnieżdżony nieruchomości. Na przykład:
type: 'notes',
attributes: {
id: '123456789',
body: '...',
tags: ['batman', 'superhero']
}
2) tagi jako własny zasób. Na przykład:
type: 'notes',
data: {
id: '123456789',
body: '...',
tags: [1,2,3] // <= Tag IDs instead of strings
}
jednej ze podejść powyżej może działać, ale szukam rozwiązania, które pozwoli skalowalność i spójność danych (wyobrazić milion notatek i dziesięć milionów tagów). W tym momencie pochylam się do opcji nr 1, ponieważ łatwiej jest poradzić sobie z kodowaniem, ale niekoniecznie jest to właściwa opcja.
Jestem bardzo zainteresowany słuchaniem myśli na temat różnych podejść, szczególnie, że nie mogę znaleźć podobnych pytań na SO dotyczących tego tematu.
Aktualizacja Dziękuję za odpowiedzi. Jedną z najważniejszych rzeczy dla mnie jest określenie, dlaczego korzystanie z jednego na drugim jest korzystne. Chciałbym, żeby odpowiedź zawierała trochę listy pro/con.
Mówisz o tym podczas przechowywania w DB lub kiedy dane wyjściowe są zwracane z reszty? –
Czy w tagu są jakieś inne informacje oprócz imienia i nazwiska, a może również ID? –
Tagi zawierają tylko wartość ciągu. To pytanie dotyczy zarówno projektu RESTful, jak i pamięci DB - zaktualizowałem moje pytanie, aby to odzwierciedlić. –