czy należy zaprojektować bazę danych przed napisaniem kodu aplikacji?
<p>jaki jest najłatwiejszy i najbardziej wydajny sposób zaprojektowania bazy danych? z mojego punktu widzenia istnieje kilka opcji projektowania magazynu danych aplikacji:</p><ol> <li>zaprojektuj bazę danych najlepiej jak potrafisz początkowo <strong>przed napisaniem dowolnego kodu aplikacji</strong>. daje to zaletę posiadania podstawowej struktury danych, z której można pracować. moim zdaniem wadą tego jest to, że będziesz mieć <em> wiele zmian </em> jako specyfikę aplikacji, które wpływają na to, co/gdzie/jak zmiany danych przez cały cykl tworzenia aplikacji.</li> <li><em> zaprojektuj bazę danych, gdy aplikacja zacznie działać </em>. gdy potrzebujesz kilku obiektów bazy danych podczas pisania aplikacji, rozwijasz bazę danych równolegle (chronologicznie) do aplikacji. zaletami byłyby mniej zmian w strukturze bazy danych. wadą byłby podział czasu i prac rozwojowych między kod aplikacji i tworzenie baz danych.</li> </ol><p>co według twojego doświadczenia jest najbardziej wydajną i wydajną metodą?</p>
<p>oprócz innych odpowiedzi ...</p><p> <a href="https://dba.stackexchange.com/questions/1677/is-there-any-good-tool-for-making-database-design-and-prototypes/1678#1678">najpierw przechwytywanie modelu koncepcyjnego</a> powinno określać zakres i wymagania. na tej podstawie możesz uzyskać logiczne i fizyczne modele danych.</p><p>gdy jest to w większości statyczne, masz stabilną bazę danych, na której można zbudować aplikację. jest to sprzeczne z pierwszą opcją.</p><p>twój drugi punkt zakończy się brudną, niemożliwą do utrzymania <em> kulą błota </em>. model danych nigdy nie zostanie naprawiony: jeśli nie zaprojektowałeś go z góry, nie będziesz miał czasu, aby go naprawić przed wysyłką. będziesz zbyt zajęty hakowaniem rzeczy razem.</p><p>nastąpią niewielkie zmiany w schemacie, łączenie lub dzielenie tabel, zmiana relacji itp., ale na zlokalizowanych „wyspach”, a model + podstawowy projekt pozostaną niezmienione.</p>
To pytanie jest załadowany, dane Driven Design vs domenie napędzane projektu. Dla każdej aplikacji, która ma dobrą ilość zachowań, a następnie powinny być preferowane domeny Driven Design. Raportowania, lub aplikacje użytkowe wydają się działać lepiej (lub są szybsze rozwijanie) z danych Driven Design.


Co pytasz jest „moja firma powinna dokonać fundamentalnej zmiany w jaki projektujemy naszego kodu”. Jako domena-dziwaka, moja reakcja jelit jest krzyczeć **tak** . Jednak przez prosty charakter Twojego pytania, nie jestem pewien, że w pełni zrozumieć zakres zmian pan proponuje. Myślę, że powinieneś porozmawiać ze swoim zespołem o nim.


Trochę literatury, takich jak [DDD Evana](http://domaindrivendesign.org/books/index.html#DDD_apply) książki lub [wolnego fundamentów ebook](http://codebetter.com/blogs/karlseguin/archive/2008/06/24/foundations-of-programming-ebook.aspx) , a następnie będziesz w stanie lepiej ocenić, w jakim kierunku należy się udać. Obie alternatywy, które zostały wskazane ma wady i zalety, decyzja zależy od tego jak to plusy i minusy wpływa na aplikację:



> 
> Pobrać wszystkie wartości z bazy danych przy użyciu zwykłego PHP następnie przechowywać je w zmiennej JavaScript, później szukać sekund rozwijanej listy (jeśli wartość pierwszej rozwijanej liście na zmiany wartości) w zmiennej JavaScript (array).
> 
> 
> 


Plusy:


* Minimalizuje petycje http, trzeba tylko jedną prośbę, aby odzyskać całość danych.
* Minimalizuje kwerenda jest potrzebne w bazie danych, na ogół tylko wykonać jedno zapytanie.


Cons:


* Zwiększa ilość pamięci używanej jeśli masz duże ilości danych.
* Jeśli dane zmienia się nieustannie, użytkownicy nie widzą zmian aż odświeżyć całą stronę.



> 
> Jeśli pierwszy rozwijanej liście zmian wartości jest następnie pobrać wartości dla drugiej listy rozwijanej z bazą danych za pomocą technologii AJAX (jQuery).
> 
> 
> 


Plusy:


* Nie trzeba do przechowywania wszystkich danych w pamięci całych jedynie dane, które zostaną wykorzystane, co zmniejsza ilość potrzebnej pamięci.
* Twoje dane są aktualizowane za każdym razem, bez konieczności przeładowania strony tylko zmieniając wybór.


Cons:


* Trzeba wykonać kilka petycji HTTP i biegnie querys z bazą danych przy każdej zmianie wyboru.


Osobiście preferuję metodę 2, jeśli ilość danych jest stosunkowo duża i wydajność nie jest koniecznością. Może jestem szalony, ale obawy o prędkości w takich przypadkach przy użyciu języka interpretacyjny jest jak próbuje dowiedzieć się, jaki kolor pomalować szopy. Załóżmy nawet nie dostać się do idei, że ten rodzaj optymalizacji jest całkowicie przedwczesne.


Trafisz sedno, gdy powiedział: „konserwacji”. Chciałbym wybrać podejście, które jest najbardziej wydajne i najbardziej utrzymaniu. Jeśli trzeba przyspieszyć później, to nie przyjdzie od przełączania między proceduralne kontra obiektowego paradygmaty kodowania wewnątrz interpretowanym języku. Z ograniczeniem, że klauzula warunek może być „coś”, to jesteś ograniczony do skanowania całą listę i stosując warunek.


Jeśli istnieją ograniczenia dotyczące klauzuli stan, wtedy można spojrzeć na organizowanie danych do bardziej efektywnie obsługiwać zapytań.


Na przykład, przykładowy kod z „byFirstLetter” słowniku nie pomaga w ogóle z „endswith” zapytania.


Więc tak naprawdę sprowadza się do tego, co pyta chcesz zrobić przed tymi danymi.


W bazach danych, problem ten jest ciężar „optymalizator zapytań”. W typowej bazy danych, jeśli masz bazę danych bez indeksów, oczywiście każde zapytanie będzie skan tabeli. Jak dodać indeksów w tabeli, optymalizator może użyć tych danych do bardziej wyrafinowanych zapytań planuje lepiej dostać się do danych. To w istocie problem, który opisujesz.


Gdy masz bardziej konkretny podzbiór typów kwerend następnie można zrobić lepszą decyzję, co struktura jest najlepsza. Ponadto, należy wziąć pod uwagę ilość danych. Jeśli masz listę 10 elementów każdy mniej niż 100 bajtów, skan wszystko może okazać się najszybciej, co można zrobić, ponieważ masz taką małą ilość danych. Oczywiście, że nie skaluje się do elementów 1M, ale nawet sprytnych technik dostępu nosić koszt w instalacji, konserwacji (jak utrzymanie indeksu) i pamięć.


**EDIT** , na podstawie komentarza


Jeśli jest to auto Nieukończenie, jeśli dane są statyczne, a następnie posortować je i używać przeszukiwanie binarne. Nie jesteś naprawdę dzieje się szybciej niż to.


Jeśli dane są dynamiczne, a następnie zapisać go w zrównoważonym drzewie, i szukać tego. To skutecznie wyszukiwanie binarne, a to pozwala zachować dodać dane losowo.


Coś jeszcze jest jakaś specjalność na tych pojęć. Jest to istotne, jeśli mają miejsce, w którym dane mogą zapełnić się partycję i zapobiec coś innego z systemem; Pliki dziennika aplikacji może wypełnić partycji i nie pozostawiają miejsca na tmp inne aplikacje do zapisu lub systemu operacyjnego do zapisu, tak tak, nadal istnieją istotne powody do partycji. Wystarczy spojrzeć na to, co trzeba i zdecydować, czy cokolwiek może zapobiec reszty systemu przed użyciem. Jeśli tak, chcesz podzielić się więc, że jeśli robi się maksymalną przestrzeń, tylko niszczy się. Domyślnie **zawsze wystarczy utworzyć nowy folder** w ramach tego samego projektu


* Dostaniesz jeden zespół (bez dodatkowego ILMerge gimnastyki)
* Łatwiej zaciemniać (bo trzeba będzie mniej typów publicznych i metod, najlepiej wcale)


Oddzielenie kodu źródłowego do wielu projektów ma sens tylko jeśli ...


* Mają pewne fragmenty kodu źródłowego, które są częścią projektu, ale nie rozmieszczenia domyślnie na wszystkich (lub testów jednostkowych, dodatkowych wtyczek itd.)
* Więcej deweloperów zaangażowanych i chcesz traktować swoją pracę jako zużyciu czarnej skrzynki. (Nie bardzo zalecane)
* Jeśli można wyraźnie oddzielić swój projekt do izolowanych Warstwy / modułów i chcesz się upewnić, że nie mogą one cross-konsumować **wewnętrzne** członków. (również nie zalecane, ponieważ trzeba będzie zdecydować, który aspekt jest najważniejszy)


Jeśli uważasz, że niektóre części kodu źródłowego może być wielokrotnego użytku, nadal nie tworzyć go jako nowego projektu. Tylko czekać, aż będzie naprawdę chcą używać go w innym roztworze i odizolować go od pierwotnego projektu, ile potrzeba. Programowanie nie jest lego, ponownego użycia jest zazwyczaj bardzo trudne i często nie nastąpi zgodnie z planem. Jeśli pracujesz jako wykonawca, powiedziałbym, że jest to 100% od twojego pracodawcy. Powiedz im, że osiągnięcie celów, które dla ciebie wyznaczyli, oznacza, że inne rzeczy, które twoim zdaniem powinny być uważane za cele, nie są robione; zapytaj ich, czy chcą dostosować twoje cele. Być może powiedzą Ci, abyś kontynuował swoją pracę, ponieważ Twój czas jest kosztowny i chcą jak najkorzystniejszej relacji jakości do ceny. 


Jeśli pracujesz jako pracownik, możesz mieć więcej swobody w planowaniu sukcesji (lub być może istnieje oczekiwanie, że już to robisz). Wciąż jednak poinformuj o tym kierownika lub menadżera swojego zespołu, ponieważ muszą oni wiedzieć o problemie i o tym, jak Ty się czujesz i jak powinieneś się zachowywać. 


Kilka rzeczy, które mogłyby pomóc w planowaniu sukcesji: 


* Codzienne procesy powinny być w pewnym stopniu udokumentowane, ale jest prawdopodobne, że inni ludzie w Twoim zespole stosują te same procesy i mogą nauczyć ich nowego pracownika. Jeśli nie wszyscy używają podobnych procesów, to jest to aktualny problem, który powinien być rozwiązany; zbierzcie się, przedyskutujcie, który sposób jest najlepszy, przyjdźcie do jakiegoś standardu (za zgodą lub pod przymusem z góry) i użyjcie standardu, gratulacje, które standard może znaleźć się w dokumentacji dla nowicjusza.
* Ważne rzeczy, które są przekazywane za pomocą poczty elektronicznej, spotkań, lub przypadkowych rozmów, muszą zostać przekształcone we wspólny zasób, wszystko od folderu dokumentów na wspólnym dysku do wiki. Istnieje to dziwne przekonanie (przynajmniej tam, gdzie pracowałem), że jeśli coś zostanie przesłane pocztą elektroniczną do wszystkich członków zespołu, to na zawsze będzie to wiedzieć; nie bierze to pod uwagę tego, że skład zespołu się zmienia i że jakiekolwiek szkolenie (jeśli w ogóle się odbędzie) nigdy nie przekaże całej wiedzy, tylko podzbiór często używanej wiedzy.
* (Możliwe, że specyficzny dla oprogramowania) Dokumentuj wyraźnie przeciwintuicyjne procesy lub decyzje projektowe, ważne jest, aby określić, że proces jest uznawany za przeciwintuicyjny i dlaczego tak jest, niezależnie od tego. Na przykład, jeśli Twój klient poprosił Cię o zrobienie czegoś, co wydaje się "nieprawidłowe" ("Nie jestem ekspertem w dziedzinie, ale czy jesteś pewien, że chcesz to zrobić?"), a Ty wyjaśniłeś, dlaczego uważasz, że to było nieprawidłowe i potwierdziłeś, że to było to, czego chciał (jeszcze lepiej, jeśli wyjaśniłeś dlaczego), to należy udokumentować powody, dla których uważałeś, że to było nieprawidłowe i wyjaśnić, dlaczego to było prawidłowe. Że funkcje oprogramowania według specyfikacji nie wystarczą do zastąpienia, będą miały to samo pytanie, co Ty.
* Dla każdego problemu, który napotkasz, a którego rozwiązanie wymaga dużo czasu/badań, dokumentuj problem, objawy, skróconą drogę do rozwiązania (tj.: wiedząc to, co wiesz teraz, jaka była najszybsza droga od rozpoznania objawów do rozwiązania), i rozwiązanie. Objawy są naprawdę ważne dla Twojego zastępstwa, ponieważ uderzą w nie zanim w pełni zrozumieją problem.
* Poprzedni punkt jest jeszcze ważniejszy w odniesieniu do starszych systemów, takich jak biblioteki czy platformy, gdzie nowe wersje są wydawane, ale nie używane w Twoim produkcie. Problemy, które napotkasz w swojej wersji (lub, co gorsza, w interakcjach pomiędzy kilkoma starszymi systemami) mogą zostać rozwiązane w przyszłych wersjach, a więc samo istnienie wady zniknie z publicznej wiedzy, aż do momentu, w którym znalezienie informacji o niej będzie prawie niemożliwe. Cóż, jeden z reaons dlaczego zajęcia zazwyczaj zawierają członków prywatnych z publicznymi pobierające / ustawiające jest dokładnie ponieważ mogą zweryfikować dane.


Jeśli masz numer niż może wynosić od 1 do 100, na pewno umieścić coś w seter, że sprawdza, a następnie może rzucić wyjątek, który jest złowionych przez kod. Powód jest prosty: jeśli nie rób tego w seter, trzeba pamiętać, że od 1 do 100 ograniczenie każdym razem, gdy go ustawić, co prowadzi do kodu duplikaty lub gdy go zapomnieć, prowadzi do nieprawidłowym stanie.


Jeśli chodzi o wydajność, jestem z Knuth tutaj:



> 
> „Powinniśmy zapomnieć o małej wydajności, powiedzmy około 97% czasu. Przedwczesna optymalizacja jest źródłem wszelkiego zła”
> 
> 
> To naprawdę zależy od rodzaju danych, które zabierasz powrotem. Ponieważ zbiór danych (w efekcie) tylko zbiór DataTable obiektów, można zwracać wiele różnych zestawów danych w jednym, a więc łatwiejsze, obiektu. 


Performance-mądry, jesteś bardziej prawdopodobne, aby uzyskać nieefektywność z zapytaniami niezoptymalizowanych niż z „niewłaściwym” wybór .NET konstruktu. Przynajmniej tak było moje doświadczenie. Użyj edycję programu Visual Studio do bazy danych skryptu z bazą danych. Działa jak czar i można użyć dowolnego systemu kontroli źródła, oczywiście najlepiej, jeśli ma wtyczek VS. Narzędzie posiada również szereg innych przydatnych funkcji. Sprawdź je tutaj, w tym wielkim poście


<http://www.vitalygorn.com/blog/post/2008/01/Handling-Database-easily-with-Visual-Studio-2008.aspx>


lub sprawdzić MSDN dla oficjalnej dokumentacji