Golang a struktury danych

0

Hej,
Jak dotąd pracowałem w nierelacyjnymi bazami w Go i struktura aplikacji wyglądała mniej-więcej tak:
Repository jako interfejs do zapytań bazy zwracający strukturę 1:1 z mongo i w razie potrzeby assembly do ViewModeli.

Teraz chciałbym w prywatnych projektach użyć relacyjnej bazy danych (prawdopodobnie Postgresa) i zastanawiam się jak to połączyć w całość, żeby kod był w miarę przejrzysty

Powiedzmy, że mam 2 tabele np user i user_posts. W prostym przypadku mogę pobrać najpierw usera a później jego posty i będę mieć 2 struktury odpowiadające widokowi.
Teraz chcemy pobrać np 10 ostatnich postów i informację o użytkowniku - wypadałoby stworzyć nową strukturę która ma w sobie np te 2 wyżej wymienione struktury i załątwić to 1 query, czyli już mamy 3 strukturę.
Teraz np chcemy wyświetlić 2 pola z users i 2 pola z user_posts - też pewnie lepiej by było to załatwić 1 selectem i pobrać to co potrzebujemy, a nie pobrać wszystko i później w kodzie wyciągać ze struktur to co potrzebujemy - dochodzi kolejna struktura.
Wraz z wielkością projektu zacznie to się niesamowicie rozrastać i będzie ciężko to utrzymać.

Prosiłbym o pomoc jak zorganizować kod w Go i w jaki sposób uchronić się przed tak szybko rosnącą(o ile się da zrobić to sensownie) ilością struktur. Nie chciałbym używać ciągle np struktur user i userPosts z użyciem omitempty, bo to wydaje mi się złe. Z tego co próbowałem doczytać, w innych językach są mapery. Mogę zawsze próbować to rzutować na mapę i robić customowe ready z bazy, ale wtedy zabraknie mi 'znajomości' struktur danych po wykonaniu zapytań.

1

Nie jestem mocno pewny czy dobrze zrozumiałem Twój post więc gdyby coś było nie tak to daj znać.

Nie bardzo rozumiem w jakim celu chcesz robić pierdyliard struktur do błahych rzeczy? Można przecież zrobić to prościej w jednej większej strukturze:

// Struktura całej bazy
type Data struct {
  // ...
}

// *Przykładowe* zapytania, które są Ci potrzebne
var (
    queryGetUsers     db.Query = "SELECT user_id, first_name, last_name, active, modified_date FROM users"
    queryGetUserPosts db.Query = "SELECT user_id, first_name, last_name, active, modified_date FROM users WHERE user_id=:user_id"
)

// Pobieram posty usera
func (db *Data) GetUserPosts(user *User) ([]Posts, error) {
  // ...
}

// Pobieram jego zamówienia
func (db *Data) GetUserOrders(user *User) ([]Orders, error) {
  // ...
}

Zrobiłbym sobie gotowe zapytania z jedną strukturą wszystkich danych, a potem pisał do tego tylko odpowiednie funkcje. Nie wiem po co tworzyć za każdym razem nową strukturę To jest najprostszy scenariusz do niedużego projektu. Nie napisałeś nic o rozmiarach...
Takie rozwiązanie dla mnie osobiście byłoby najczytelniejsze. Mam wtedy jeden pakiet. Można zrobić to w jednym pliku albo strukturę rozbić na osobne pliki - będzie krócej ale więcej przeklikiwania się później. Dzięki takiemu rozwiązaniu w kodzie później nie muszę pisać jakichś zapytań tylko wywołuję je z pakietu z bazą.

Nie ma potrzeby komplikować sobie projektu. Różne rzeczy z utrudnianiem kodu w Go już widziałem. Pakowanie tony interfejsów włącznie gdy nie były one potrzebne bo używano ich aż raz.

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