Struktura bazy danych ze słownictwem

0

Witam :)
Piszę sobie w ramach treningu stronkę/apkę/PWA, która ma służyć do nauki słownictwa angielskiego. No i teraz zastanawiam się, jak najoptymalniej zaprojektować bazę danych. Docelowo oczywiście chciałbym aby tłumaczenie nie było tylko angielskie, ale żeby można kiedyś łatwo dodać nowy język. Tak więc zakładam, że każdy język będzie miał swoją oddzielną tabelę z słówkami. Teraz chce aby każde słowo ( tak jak w google translate ) miało przypisane wiele tłumaczeń bazując na popularności. Lepiej będzie stworzyć tabele pośrednią mającą np. 4 pola z ID słówka PL oraz potem 3 ID słówek EN po kolei od najpopularniejszego? Czy może aby ta tabela miała 3 pola id_PL, id_EN, popularity ? Kolejnym pytaniem jest, jak najlepiej zapisywać słówka już "nauczone"? Powinno to być zapisywane w oddzielnej tabeli z user_id, word_id, lang_id ? Wydaje mi się, że taka tabela, może szybko stać się gigantyczna, 1000 użytkowników umiejących po 1000 słówek daje już 1mln rekordów, dlatego zastanawiałem się czy nie lepiej trzymać word_id oraz lang_id z nauczonymi słówkami jako json w oddzielnym polu tabeli użytkownika?

Z góry dzięki za rady :)

1

Czy może aby ta tabela miała 3 pola id_PL, id_EN, popularity

Jeśli założysz, że tabela będzie miała kolumny id_pl oraz id_en, w jaki sposób łatwo dodasz nowy język? :-)

Powinno to być zapisywane w oddzielnej tabeli z user_id, word_id, lang_id

IMO tak.

Wydaje mi się, że taka tabela, może szybko stać się gigantyczna, 1000 użytkowników umiejących po 1000 słówek daje już 1mln rekordów

Nom, całe ~30 megabajtów danych - ciekawe jak Twój komputer sobie z tym poradzi :-)

Zresztą kiedy już dojdziesz do tysiąca użytkowników, będziesz miał dużo większe problemy na głowie niż jakieś tabelki w jakiejś bazie.

dlatego zastanawiałem się czy nie lepiej trzymać word_id oraz lang_id z nauczonymi słówkami jako json w oddzielnym polu tabeli użytkownika?

Nie zmieni to przecież ilości danych, tylko przeniesie je w inne miejsce, które jest znacznie mniej wygodne w obsłudze.

0

Milion to nie dużo
BIGINT 9,223,372,036,854,775,807 max
z jsonem ciekawy pomysł

0
Patryk27 napisał(a):

Jeśli założysz, że tabela będzie miała kolumny id_pl oraz id_en, w jaki sposób łatwo dodasz nowy język? :-)

Po prostu dodam nową migrację z tabelą z polami np. id_pl id_es oraz nową table ze słówkami ES, minuta roboty, ważne aby mechanizmy mogły potem to bez problemu obsłużyć. Oczywiście drugą opcją jest trzymanie wszystkich słówek wszystkich języków w jednej tabeli z dodatkowym polem "lang" ale czy to jest lepsze rozwiązanie?

Nom, całe ~30 megabajtów danych - ciekawe jak Twój komputer sobie z tym poradzi :-)

Bardziej mi chodzi o szybkość/wydajność przeszukiwania takiej tabeli niż o jej wielkość. Jakoś nie wydaje mi się aby przeszukiwanie takiej tabeli za każdym razem kiedy użytkownik się uczy słówek i sprawdzanie czy dane słówko już jest nauczone, było optymalnym wyjściem. Dlatego pytam się Was, bardziej doświadczonych :)

Nie zmieni to przecież ilości danych, tylko przeniesie je w inne miejsce, które jest znacznie mniej wygodne w obsłudze.

No tak, ale dzięki temu, zapytanie będzie polegało na pobraniu jednego pola z bazy i przetworzeniu potem danych a nie na przeszukiwaniu jednej wielkiej tabeli, nie ma to znaczenia w wydajności?

biela_ napisał(a):

Milion to nie dużo

No tak, może ilościowo to nie dużo, ale nie za bardzo znam się na wydajności baz i nie wiem czy ciągłe przeszukiwanie nawet tych miliona rekordów aby znaleźć odpowiednie 1000, jest optymalną opcją. Nie chodzi mi o samą ilość ale o ideę poprawnej i optymalnej obsługi takich danych w danym przypadku :)

Dzięki panowie za uwagi! :)

3

Bardziej mi chodzi o szybkość/wydajność przeszukiwania takiej tabeli niż o jej wielkość

No to w takim razie zakładasz indeks(y) i przeszukiwanie będzie bardzo zgrabne. Wadą indeksów jest spowolnienie dodawania danych do bazy, ale jeśli nie masz tam non-stop wrzucania ogromnych ilości danych, a ponadto przeważającymi operacjami będzie odczyt - indeksy się nadadzą idealnie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1