Chciałbym wiedzieć, jaki jest najlepszy projekt kodu podczas przechowywania i pobierania danych z bazy danych podczas pracy z obiektami i klasami.

Mogłem to zrobić na dwa sposoby.

W konstruktorze klas wysyłam zapytanie do bazy danych i przechowuję wszystkie informacje w zmiennych instancji wewnątrz klasy i pobieram je za pomocą getterów/setterów. W ten sposób zawsze mogę uzyskać dowolne informacje, ale w wielu przypadkach nie będę potrzebować wszystkich informacji przez cały czas.

public class Group {
    public int GroupID { get; private set; }
    public string Name { get; private set; }
    public Group(int groupID)
    {
        this.GroupID = groupID;
        this.Name = // retrieve data from database
    }
    public string getName()
    {
        // this is just an example method, I know I can retrieve the name from the getter :)
        return Name;
    }
}

Innym sposobem jest utworzenie kilku metod i przekazanie identyfikatora grupy jako parametru, a następnie zapytanie bazy danych o konkretne informacje, których potrzebuję. Może to spowodować więcej zapytań, ale uzyskam tylko potrzebne informacje.

public class Group {    
    public Group()
    {
    }
    public string getName(int groupID)
    {
        // query database for the name based on groupID
        return name;
    }
}

Jak myślisz, jaka jest najlepsza droga? Czy jest tu jakaś najlepsza praktyka, czy to ode mnie zależy, co moim zdaniem działa najlepiej?

0
aelveborn 26 luty 2012, 04:35

3 odpowiedzi

Najlepsza odpowiedź

Nie chcesz wykonywać ciężkiej pracy z DB w konstruktorze. Ciężką pracę należy wykonywać metodami.

Nie chcesz również koniecznie łączyć pracy bazy danych z klasą jednostki, która przechowuje dane. Co zrobić, jeśli chcesz, aby metoda zwracała dwa z tych obiektów z bazy danych? Na przykład GetGroups() - nie można nawet skonstruować bez wykonywania pracy z bazą danych. W przypadku czegoś, co zwraca wiele, przechowywanie i pobieranie są oddzielone od klasy encji.

Zamiast tego oddziel pracę bazy danych od obiektów encji. Jedną z opcji jest to, że możesz mieć warstwę dostępu do danych z metodami takimi jak GetFoo lub GetFoos itp., które wysyłają zapytanie do bazy danych, wypełniają obiekty i zwracają je.

Jeśli korzystasz z ORM, zobacz:

https://stackoverflow.com/questions/3505/what-are-your-favorite-net-object-relational-mappers-orm

1
Community 23 maj 2017, 15:03

Leniwe ładowanie kontra wczesne ładowanie, do którego tak naprawdę się to sprowadza, najlepiej określa użycie.

Przeważnie oznacza to podmioty powiązane — jeśli na przykład masz do czynienia z indywidualnym adresem, oddzielenie odczytu dla miasta od odczytu dla stanu byłoby szaleństwem; OTOH przy zwrocie listy pracowników firmy czytających swoje dane adresowe to prawdopodobnie strata czasu i pamięci.

Ponadto nie są to wzajemnie wykluczające się opcje — możesz mieć konstruktor wywołujący bazy danych i konstruktor korzystający z dostarczonych danych.

1
jmoreno 26 luty 2012, 10:49

Jeśli jest to relacyjna baza danych, najlepszym sposobem byłoby zrobienie tego za pomocą ORM (mapowanie obiektowo-relacyjne). Zobacz tutaj listę maperów ORM:

https://en.wikipedia.org/wiki/List_of_object-relational_mapping_software

0
Marc 26 luty 2012, 04:42