• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

projektowanie bazy danych - null czy osobna tabela?

Object Storage Arubacloud
0 głosów
116 wizyt
pytanie zadane 21 maja 2020 w SQL, bazy danych przez Bizuma Gaduła (3,650 p.)
Witam, chciałbym się dowiedzieć, która z podanych niżej opcji jest bliższa idealnemu projektowi bazy danych.. a może jest coś innego co nie przyszło mi do głowy?

Dla jak najjaśniejszego przedstawienia problemu posłużę się przykładem.

Wyobraźmy sobie, że tworzymy jakąś grę i tworzymy bazę danych dostępnych w niej jednostek.

Jednostki mogą, ale nie muszą, posiadać statystykę "atak". Dla przykładu należy podkreślić, że atak = 0, obraz brak ataku ( null ) to dwie różne wartości w naszej grze. Przykładowo, jednostka o wartości ataku 0 może dostać jakiegoś tymczasowego buffa od innej jednostki, ale jednostka z wartością ataku null takiego buffa dostać nie może.

Sedno pytania - czy projektując bazę danych przechowującą listę wszystkich jednostek lepiej jest zrobić dla każdej jednostki kolumnę o nazwie "atak", wtedy tabela mogłaby wyglądać tak: Jednostki[id, name, atak] a kolumna atak mogłaby przyjąć inta lub nulla.

Czy może lepiej jest zrobić osobną tabelę w relacji jeden do jeden przechowującą dane o ataku dla jednostek, które ten atak posiadają. Wtedy wyglądałoby to tak: Jednostki[id, name]   Atak[jednostka_id, wartość]

Z góry dziękuję za rozwianie moich wątpliwości (:

1 odpowiedź

+1 głos
odpowiedź 21 maja 2020 przez Ehlert Ekspert (212,670 p.)
wybrane 21 maja 2020 przez Bizuma
 
Najlepsza

Generalnie to o czym piszesz jest rozwiązane w wielu ORMach. W doctrine nazwali to Discriminator i umożliwia ustrukturyzowanie obiektów aplikacji na bazie danych. Wygląda to następująco:

  1. Single table - rozwiązaniem są pola typu null. Zaleta jest tak że wszystko trzymane jest w jednej tabeli. Wad jest o wiele więcej: różnice zawarte między poszczególnymi obiektami muszą być niewielkie, gdyż tabela ma tyle kolumn ile jest łącznie wszystkich pól. Kolejny problem jest taki iż to rozwiązanie jest całkiem mocno zamknięte na zmiany. Potem trzeba walczyć z migracją danych jeśli poszczególne typy zaczną się bardziej różnić. Ostatni problem jaki dostrzegam to fakt, iż kolumny nullable ważą więcej. Ma to znaczenie dla nieco większej skali, ale dobrym zwyczajem jest branie tego pod uwagę.
  2. Join table - mamy jedną tabelę dla klasy bazowej trzymająca wszystkie pola wspólne jednostek. Ogólnie polecam całkiem spoko rozwiązanie. Problem jaki może się tutaj pojawić to oddzielna tabela per typ. Przy bardziej rozbudowanych systemach 100 typów to 100 oddzielnych tabel. devilpotem z poziomu samej bazy ciężko to agregować.
  3. Wykorzystanie jsona. Zarówno mysql oraz postgres wspierają typ json. Pola uniwersalne dla jednostek możesz trzymać w kolumnach, dane specyficzne w jednej kolumnie z jsonem. Połowiczna otwartość na zmiany: mogą być problemy z ewentualną migracją danych, ale bardziej przykry jest fakt iż cały czas musisz w swojej aplikacji zapewniać obsługę dla każdego rodzaju schemy takiego jsona. 

 Jest jeszcze jedna kwestia. Czy jeśli mam 200 jednostek takiego samego typu to atak każdej będzie inny? Może nie i wtedy nie warto robić kolumn, tylko trzymać to w constach po stronie aplikacji albo w innej tabeli, w pojedynczym rekordzie. wink​​​​​​

Niestety odpowiedź na tego typu pytania zawsze brzmi zależy. Przeanalizuj to co opisałem i dobierz dobre rozwiązanie.

1
komentarz 21 maja 2020 przez Bizuma Gaduła (3,650 p.)
Dziękuję za odpowiedź. Muszę przyznać, że dało mi to dużo szerszy obraz na sytuację niż oczekiwałem c;
komentarz 21 maja 2020 przez Ehlert Ekspert (212,670 p.)

Dobrze że mogłem pomóc. Nie wiem w jakim języku piszesz, czy może zajmujesz się tylko db, ale warto tutaj korzystać z gotowych ORMów i bibliotek które dużo rzeczy automatyzują. Z drugiej strony warto dobierać rozwiązania przyszłościowe patrząc poza tym co dostarczają biblioteki wink

Podobne pytania

0 głosów
1 odpowiedź 124 wizyt
+1 głos
2 odpowiedzi 464 wizyt
pytanie zadane 24 października 2021 w SQL, bazy danych przez Beginner555 Obywatel (1,760 p.)
+1 głos
3 odpowiedzi 777 wizyt
pytanie zadane 17 czerwca 2021 w SQL, bazy danych przez manjaro Nałogowiec (37,390 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...