Datatable zestawu danych vs




Obecnie używać DataTable, aby uzyskać wyniki z bazy danych, które można używać w moim kodu.


Jednak wiele przykładów na wystawie internetowej przy użyciu DataSet zamiast i uzyskiwania dostępu do tabeli (ów) za pomocą metody zbiorów.


Czy jest jakaś korzyść, wydajność mądry lub w inny sposób, z użyciem DataSetów lub DataTables jako metoda przechowywania wyników SQL?
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.
Jest to dość szerokie, ale dam ci tak ogólną odpowiedź, jak tylko mogę.

**CTE ...**

* Są niezindeksowalne (ale mogą używać istniejących indeksów na obiektach, do których istnieją odwołania)
* Nie można mieć ograniczeń
* Są zasadniczo jednorazowe `VIEW` s
* Trwać tylko do momentu uruchomienia następnego zapytania
* Może być rekurencyjny
* Nie masz dedykowanych statystyk (polegaj na statystykach dotyczących podstawowych obiektów)

**#Temp Tables ...**

* Są prawdziwe zmaterializowane tabele, które istnieją w tempdb
* Może być indeksowany
* Może mieć ograniczenia
* Trwaj w życiu obecnego POŁĄCZENIA
* Może odwoływać się do innych zapytań lub podprocedur
* Masz dedykowane statystyki generowane przez silnik

Jeśli chodzi o użycie każdego z nich, mają bardzo różne przypadki użycia.Jeśli masz bardzo duży zestaw wyników lub musisz odwołać się do niego więcej niż raz, umieść go w tabeli `#temp` .Jeśli ma być rekurencyjny, jednorazowy lub po prostu dla uproszczenia logicznego, preferowany jest `CTE` .

Ponadto należy `CTE`**nigdy nie używaj do wykonania**.Prawie nigdy nie przyspieszysz przy użyciu CTE, ponieważ znowu jest to widok jednorazowy.Możesz zrobić z nimi kilka fajnych rzeczy, ale przyspieszenie zapytania nie jest jednym z nich. <p>ma więcej kolumn niż pokaż status tabeli; ale robi sztuczkę:</p><pre><code>select * from information\_schema.tables where table\_schema = database(); </code></pre><p>aktualizacja 2011-06-07 19:02</p><pre><code>select table\_name,engine,version,row\_format,table\_rows,avg\_row\_length, data\_length,max\_data\_length,index\_length,data\_free,auto\_increment, create\_time,update\_time,check\_time,table\_collation,checksum, create\_options,table\_comment from information\_schema.tables where table\_schema = database(); </code></pre><p>te zapytania działają, jeśli ustawisz bieżącą bazę danych.</p><p>możesz także kodować konkretną bazę danych:</p><pre><code>select table\_name,engine,version,row\_format,table\_rows,avg\_row\_length, data\_length,max\_data\_length,index\_length,data\_free,auto\_increment, create\_time,update\_time,check\_time,table\_collation,checksum, create\_options,table\_comment from information\_schema.tables where table\_schema = 'mysql'; </code></pre> 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ą. <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> ło panie. dobra. jeśli używasz entity framework, to wybierz wszystko, co jest w danej tabelce do zmiennej (i już masz dane 2 cache). sprawdzasz ile masz tam danych metodą count dostępną dla list. robisz tablicę dynamiczną i wrzucasz tam dane podzielone z listy. zwykły for od 0 do tego, ile zwróciło … <p>w większości baz danych a <code>not null</code> kolumna będzie bardziej wydajna pod względem przechowywanych danych z podanego powodu, a także bardziej wydajna w wyszukiwaniu i indeksowaniu - więc jeśli nie chcesz zezwalać na wartości null w kolumnie, powinieneś je wyraźnie zabronić.</p><p>będzie to miało niewielki wpływ na wydajność, ponieważ dodatkowe <code>not null</code> ograniczenia będą potencjalnie musiały być sprawdzane dla każdego wiersza, którego dotyczy zmiana za pomocą insert lub update, ale ponieważ większość baz danych jest względnie łatwa do zapisu i bardzo obciążona odczytem, ​​prawdopodobnie nie stanowi to problemu (mało czasu poświęconego na to jest zauważalne przy w każdym razie, ponieważ jest to operacja związana z procesorem, w której reszta operacji wstawiania/aktualizacji będzie związana z operacjami we/wy, a więc o wiele bardziej znaczącym „wąskim gardłem” i daje pewne „bezpłatne” sprawdzanie danych, więc kod (lub inny) kod osoby) nie może przypadkowo umieścić wartości null tam, gdzie inny kod ich nie oczekuje, a zatem może dawać nieprawidłowe wyniki w ich obecności.</p><p>edycja: jak peter wskazuje w swoim komentarzu, powyższe jest generalizmem i może nie być prawdziwe dla <em>wszystkich</em> dmbs, chociaż jestem prawie pewien, że tak jest w przypadku mysql i mssql. inne komplikacje w tym obszarze mogą obejmować takie funkcje, jak rzadkie tabele (na przykład zaimplementowane mssql 2008), które zmienią dynamikę wydajności (nie) zerowalnych kolumn.</p> <p>kolejność kolumn ma znaczenie, więc jeśli (i tylko jeśli) kolejność kolumn jest zgodna, możesz na przykład:</p><pre><code>insert into items\_ver select * from items where item\_id=2; </code></pre><p>lub jeśli nie pasują, możesz na przykład:</p><pre><code>insert into items\_ver(item\_id, item\_group, name) select * from items where item\_id=2; </code></pre><p>ale poleganie na kolejności kolumn jest błędem, który może się zdarzyć (może się zmienić, podobnie jak liczba kolumn) - utrudnia także czytanie sql</p><p>nie ma dobrego „skrótu” - należy wyraźnie wymienić kolumny zarówno dla tabeli, do której wstawiasz, jak i zapytania, którego używasz dla danych źródłowych, np .:</p><pre><code>insert into items\_ver (item\_id, name, item\_group) select item\_id, name, item\_group from items where item\_id=2; </code></pre><p><em> dbfiddle <a href="http://dbfiddle.uk/?rdbms=postgres\_9.6&amp;fiddle=cec35746a8728841974621f20cc6aba0">tutaj</a> </em></p> <pre><code>postgres=&gt; \l list of databases name | owner | encoding | collate | ctype | access privileges +++++ postgres | postgres | utf8 | en\_us.utf-8 | en\_us.utf-8 | template0 | postgres | utf8 | en\_us.utf-8 | en\_us.utf-8 | =c/postgres + | | | | | postgres=ctc/postgres template1 | postgres | utf8 | en\_us.utf-8 | en\_us.utf-8 | =c/postgres + | | | | | postgres=ctc/postgres </code></pre><p> <a href="http://www.postgresql.org/docs/current/static/sql-grant.html">dokumenty dotyczące <code>grant</code></a> zawierają wyjaśnienie, jak interpretować dane wyjściowe. aby uzyskać określone uprawnienia w tabeli bieżącej bazy danych, użyj <code>\z mytable</code>.</p> <p>byłbym bardzo podejrzliwy wobec jakiegokolwiek zestawu uniwersalnych najlepszych praktyk, ponieważ w większości tych dziedzin diabeł tkwi w szczegółach. to, że informacje są stosunkowo powszechne, nie oznacza, że ​​aplikacja korzysta z danych dokładnie w taki sam sposób, jak inne aplikacje. oznacza to, że twój model danych może być nieco inny.</p><ul> <li>imię i nazwisko: dlaczego przechwytujesz imię? jeśli masz obowiązek przechwycenia pełnego imienia i nazwiska osoby (tj. przygotowujesz dokumenty prawne lub akty urodzenia), prawdopodobnie chcesz dać ludziom więcej miejsca na pisanie niż gdybyś tylko prosił o imię i nazwisko osoby, więc wezwać ich w nowej aplikacji internetowej.</li> <li>adres: co zamierzasz zrobić z adresem? jakie adresy przechowujesz? jeśli przechowujesz adres nieruchomości w stanach zjednoczonych, na której tworzysz hipotekę, prawdopodobnie bardzo zależy ci na uzyskaniu w pełni znormalizowanego adresu, w którym to przypadku model danych prawdopodobnie będzie chciał bardzo blisko pod dowolnym adresem narzędzie normalizacyjne zwraca. jeśli chcesz tylko, aby ludzie mogli wpisać adres w celu dostarczenia produktu, prawdopodobnie wystarczy kilka wierszy tekstu swobodnego. długość linii może zależeć od wymagań dalszych procesów, które wykonują takie czynności jak drukowanie etykiet adresowych.</li> <li>stan: zakładając, że możesz zidentyfikować prawidłowe wartości stanu, prawdopodobnie sensowne jest utworzenie tabeli <code>state</code> i utworzenie relacji klucza obcego między tabelami <code>state</code> i <code>address</code>. ale możliwość zidentyfikowania prawidłowych wartości oznacza, że ​​ograniczasz zestaw prawidłowych adresów przynajmniej do określonego zestawu krajów. to jest w porządku dla wielu stron, ale musisz trochę popracować, aby wesprzeć nowy kraj.</li> <li>miasto: jeśli masz do czynienia z danymi, w których istnieją potencjalnie regulacje na poziomie miasta (tj. w których istnieją różne rodzaje stawek podatkowych, które są stosowane w zależności od miasta), możesz chcieć traktować je podobnie jak państwo i mieć <code>city</code> tabela z prawidłowymi miastami i relacja klucza obcego między tabelami <code>city</code> i <code>address</code>. z drugiej strony, jeśli próbujesz tylko dostarczyć produkt i nie przejmujesz się tym, że masz w tabeli różne wersje tego samego miasta, wystarczy, że użytkownik wprowadzi dowolny tekst. oczywiście, jeśli przechowujesz klucze obce, będziesz mieć sporo pracy, aby upewnić się, że masz wszystkie prawidłowe wartości. ale są produkty, w których chodzi o to, że firma już wykonała tę pracę (tj. bazy danych podatków od sprzedaży).</li> <li>telefon: co robisz z numerami telefonów i dlaczego? niektóre aplikacje będą chciały pobierać numery telefonów w dowolnym formacie, w którym użytkownik zdecyduje się je wprowadzić i zachować to formatowanie dla wszystkich kolejnych zapytań. byłoby to powszechne, jeśli projektujesz osobistą książkę adresową, w której użytkownicy mają własne preferencje dotyczące sposobu przechowywania i wyświetlania numerów telefonów. inne aplikacje chciałyby zignorować wprowadzone formatowanie, wyodrębnić tylko znaki numeryczne, a następnie sformatować dane przy pobieraniu, aby wszystkie numery telefonów miały podobne formatowanie. jeśli prowadzisz działalność dla firm, możesz chcieć wprowadzić oddzielne pole dla użytkowników, aby wprowadzić rozszerzenie. jeśli próbujesz wesprzeć proces połączeń wychodzących, możesz chcieć przechowywać numer kierunkowy i kod kraju w osobnych kolumnach, ponieważ chcesz mieć pewność, że masz okna specyficzne dla strefy czasowej do nawiązywania połączeń z osobami o różnych numerach kierunkowych (tworzenie połączenie z kimś ze wschodniej strefy czasowej o 10 rano będzie znacznie lepsze niż wykonanie tego samego połączenia z kimś w strefie czasowej pacyfiku, gdzie jest 7 rano).</li> <li>płeć: w przypadku wielu aplikacji jest całkowicie rozsądne przechowywanie kodu płci („m” lub „f”) w tabeli. z drugiej strony zdarzają się sytuacje, w których możesz chcieć dodatkowych opcji (inne, interseksualne, transseksualne) lub gdy musisz przechowywać coś takiego jak płeć przy urodzeniu i aktualna płeć.</li> </ul> <p>zarówno klucz złożony, jak i klucz złożony opisują klucz kandydujący z więcej niż jednym atrybutem. według relational database dictionary (c.j. data) oznaczają to samo.</p><p>w modelowaniu er termin „klucz złożony” ma również bardziej szczegółowe znaczenie. oznacza klucz, którego atrybutami składowymi są odniesienia do kluczy w innych jednostkach - tzn. klucz złożony tworzy relację identyfikującą. dla większości celów nie jest to szczególnie przydatna ani ważna koncepcja, więc terminy kompozyt/związek są często traktowane jako wymienne. prawdopodobnie najlepiej trzymać się „klucza złożonego”, chyba że odnosi się to konkretnie do koncepcji modelowania klucza złożonego.</p>