2012-05-31 14 views
7

Mam starą układankę, więc pomyślałem, że podzielę się nią z tobą, może uda się uzyskać właściwy kierunek. Rzecz w tym, że niektóre z naszych jednostek w bazie danych są dość duże (read ma wiele właściwości), a rzadko logika biznesowa używa wszystkich właściwości encji, więc za każdym razem muszę myśleć, jakie właściwości muszą być załadowane, aby logika biznesowa działała poprawnie. Bardzo hipotetyczny przykład:Podmioty za dużo?

public class Product 
{ 
    public string Title {get;set;} 
    public string Description {get;set;} 

    public string RetailPrice {get;set;} 
    public string SupplierId {get;set;} 

    public Supplier Supplier { get;set;} 

    // many other properties 
} 

public class ProductDiscountService 
{ 
    public decimal Get(Product product) 
    { 
     // use only RetailPrice and Supplier code 
     return discount; 
    } 
} 

public class ProductDescriptionService 
{ 
    public string GetSearchResultHtml(Product product) 
    { 
     // use only Title and Description 
     return html; 
    } 
} 

Wygląda mogłem wydobyć interfejsy IDiscountProduct i ISearchResultProduct, Wyrób oznakowany jako wdrożenie tych interfejsów, a następnie utworzyć mniejsze DTOs wykonawczych każdej z tych interfejsów, ale to wygląda w tej chwili jak Overkill (przynajmniej Nie widziałem nikogo grupującego właściwości za pomocą interfejsów).

Rozdzielenie obiektu w bazie danych na mniejsze obiekty również nie wygląda rozsądnie, ponieważ wszystkie te właściwości należą do produktu i obawiam się, że będę zmuszony użyć wielu sprzężeń, aby wybrać coś i jeśli zdecyduję, że jakaś własność należy do innego podmiotu, ten ruch będzie trudny do zrealizowania.

Aby każda właściwość używana w logice biznesowej danej metody jako parametr metody również wyglądała na niewłaściwą.

+0

Ile właściwości mówimy? – walther

+0

zwykle więcej niż 10, mniej niż 20. – Giedrius

+0

Powiedziałbym: jeśli twoja metoda wie z góry, które właściwości użyć i to pozostaje ustalone, to używanie parametrów może być dobrym rozwiązaniem. Łatwe do przetestowania i łatwe do ponownego wykorzystania. Jeśli jednak implementacja jest niezdefiniowana w sygnaturze metody (bieżąca implementacja używa 2 właściwości, ale jutro może się to stać 3), chcesz skonsumować całą rzecz produktu ze wszystkimi dostępnymi właściwościami. Mówi to konsekwentnie: ta metoda wymaga tych parametrów, a ta metoda wymaga produktu. – Polity

Odpowiedz

1

O ile właściwości nie są duże (czytaj długie łańcuchy i/lub pliki binarne), po prostu wczytałbym je wszystkie.

punkty poniżej są dla prostych właściwościach (np tytuł)

  1. No dodatkowy kod (Get ten produkt z tytułu tylko, lub uzyskać tylko cena, bla-bla)
  2. Instancja produktu jest zawsze kompletny, dzięki czemu możesz go przekazać bez sprawdzania, czy właściwość jest pusta.
  3. Jeśli będziesz musiał leniwym załadować inne właściwości, będzie cię to kosztować więcej niż ładowanie ich z zapałem. Jeśli masz 20 właściwości - nie jest to nawet duży obiekt (ponownie, jeśli twoja (hipotetyczna) właściwość Opis nie ma kilobajtów).

Teraz, jeśli masz powiązanych obiektów (ProductSupplier) - to powinno być leniwy, imo, chyba że wiesz, że ta właściwość będzie używana.

+0

W prawdziwym opisie projektu jest html, więc kilka kilobajtów to zwykły przypadek.Inną kwestią jest to, że ze względu na charakter naszego modelu biznesowego zwykle przetwarzamy duże ilości produktów (tysiące), więc leniwy ładunek jest nie do zaakceptowania z powodu dużej liczby zapytań. Więc jeśli masz tysiące produktów i kilobajtów we właściwościach, staje się bardzo ważne, co ładujesz z bazy danych :) Zastanawiałem się nad umieszczeniem jakiegoś szybkiego magazynu do odczytu, takiego jak reddis pomiędzy, o ile jest o wiele więcej odczytów niż zapisów. – Giedrius

+0

Zależy od rodzaju przetwarzania. Kiedy musieliśmy pracować z dużym zestawem danych w przeszłości - właśnie wczytaliśmy go do pamięci i pracowaliśmy stamtąd, ale ten zestaw był tylko do odczytu. W końcu upuszczaliśmy to rozwiązanie i wracaliśmy do bazy danych. W każdym razie, w twoim przypadku, myślę, że zmierzyłbym, jak często rzeczywiście potrzebujesz właściwości i jaki jest rzeczywisty wpływ ładowania ich z niecierpliwością. Nadal nie sądzę, że kilka Kb na rekord jest tak wiele - nawet jeśli masz kilka (5-10?) Tysięcy rekordów, to tylko kilka MB do przeczytania. Posiadanie odpowiednich indeksów byłoby o wiele ważniejsze. – Evgeni

+0

Reddis lub memcached też mogą być warte obejrzenia. Zależy od twoich potrzeb, ale coś podobnego do RavenDB może również pomóc. – Evgeni