Jeden model czy wiele?

Mam takie pytanko odnośnie modeli i przechowywania danych mam model User który ma mieć wiele wiele (wiadomo z góry ile maksymalnie) portfeli (Wallets) .
I teraz taka sprawa czy mieć jeden uniwersalny model Wallet gdzie będę trzymał wszystkie portfele użytkownikówlub np 3 modele Wallet_Euro, Wallet_Dollar, Wallet_Pln, każdy User może mieć po jednym portfelu z każdej waluty.

Co będzie bardziej wydajne powiedzmy że mamy 100 userów i możemy mieć w jednej tabeli 400 wpisów(dla unwersalnego modelu Wallet) lub w 3 tabelach po 100 wpisów dla ( Wallet_Euro, Wallet_Dollar, Wallet_Pln)

Lepiej jeśli pójdziesz w jeden model i 3 typy portfeli.

Spójrz na STI http://api.rubyonrails.org/classes/ActiveRecord/Base.html#label-Single+table+inheritance

Tylko we wszystkich portfelach będą takie same pola z różnicą nazwy i nie bardzo widzę zastosowanie STI chyba będę trzymał wszystko w jednym modelu. Będzie to wyglądać mniej więcej tak

id | wallet_type | balance | user_id 1 euro 1000 1 2 pln 0 1 3 usd 100 2
Gdyby miał być to STI to nawet nie wiem jak za bardzo miało by to wyglądać, może gdy by była różnica więcej niż jednego pola to bym widział zastosowanie .

Czy rozwiązanie każda waluta = nowy model jest zła ? Z góry wiem że będę używał tylko trzech walut (jeżeli dojdzie potrzeba czegoś nowego to dodaję nowy model).

Właśnie takie same pola sugerują, aby użyć STI :slight_smile: I wcale nie musisz mieć jednego modelu. Możesz mieć model podstawowy (bazowy), w którym trzymasz metody typowe dla każdego modelu (np. Wallet) oraz modele dziedziczące z modelu bazowego z własnymi metodami (np. Wallet_euro, Wallet_dollar itp.).

Moim skromnym zdaniem (więc możesz się nie zgodzić :wink: ) takie rozwiązanie jest zdecydowanie złe. Nawet delikatnie bym zasugerował, że nawet bardzo zdecydowanie złe.

Po pierwsze - dodanie modelu (czyli przeprogramowanie całego systemu) tylko po to, żeby obsłużyć nową walutę jest kiepskim pomysłem - przynajmniej z punktu widzenia programisty, bo biznesowo to może być strzał w dziesiątkę. Musisz tylko każdą walutę włączać oddzielnie i za każdą kasować tygodniową stawkę serwisową. :smiley:

Po drugie, czym tak na prawdę różni się portfel euro od portfelu złotówek? Po co tworzyć na to nowy model? Jeden model z atrybutem currency wystarczy w zupełności. Fizycznie przecież nie szukam po sklepach skórzanego portfela do euro. A czy może ma Pani też takie same, tylko do rubli?

Jeżeli chcesz tworzyć nową klasę obiektów, to podstawowe pytanie jest: czy ich działanie czymś się różni? Bo chyba tylko różnice w działaniu (a i to nie zawsze - czasami wystarcza if w jakiejś metodzie) uzasadnia tworzenie nowej klasy obiektów. Zobacz, że masz jedną klasę Array, a nie każdą na inny typ przechowywanych obiektów.

Niezupełnie.
Jeżeli wszystkie typy portfeli będą miały takie same metody, a różniły się np. tylko wartościami do przeliczeń walut, nie ma sensu korzystać z STI. Po co niepotrzebnie dodawać kilka pustych klas? W tej chwili mogą to być 3 typy, ale później walut może być 50.

Na początek zrobiłbym 1 model, dodał rzeczywiście kolumnę “wallet_type”, a z STI skorzystał tylko jeżeli zachowanie różnych typów portfeli zacznie się od siebie mocno różnić.

@Arsen7 - zgadzam się w 100%

Dzięki za pomoc! Na razie będę trzymał wszystko w jednym modelu.