tabela pozycji, która będzie (potencjalnie) zawierać dziesiątki milionów rekordów.
To właściwie nie tyle, biorąc pod uwagę to, co SQL Server może skutecznie obsługiwać. Oczywiście pamiętam jedno z moich wcześniejszych zadań, w którym jedna z największych tabel (system z pojedynczą instancją) miała 2 miliony wierszy i była to największa ilość, z jaką kiedykolwiek miałem do czynienia. Następnie następne zadanie obejmowało 17 instancji produkcyjnych z niektórymi tabelami zawierającymi setki milionów wierszy, a wszystkie zostały zagregowane w hurtownię danych z wieloma tabelami faktów mającymi ponad 1 miliard wierszy. Nie zrozum mnie źle, nie szydzę z dziesiątek milionów wierszy, po prostu podkreślam, że przy dobrym modelu danych i właściwym indeksowaniu (i konserwacji indeksów) SQL Server może wiele poradzić .
Do 50% produktów może być „niezatwierdzonych” w dowolnym momencie.
Hmm To nie brzmi dobrze. Wskaźnik „zatwierdzania” wpisów będzie o połowę mniejszy niż liczba nowych wpisów? Na każde 2 nowe wpisy tylko 1 zostanie „zatwierdzony”? W twoim przykładzie 2 milionów wierszy i 1 miliona dla „zatwierdzonych” i „niezatwierdzonych”, kilka lat później z kolejnymi 10 milionami wpisów, oczekujesz 6 milionów dla „zatwierdzonych” i „niezatwierdzonych”? Czy może 1 milion „niezatwierdzonych” pozostanie nieco stały, tak że przy 10 milionach nowych wpisów będzie 11 milionów „zatwierdzonych”, a 1 milion „niezatwierdzonych”?
Zapisy mogą zostać „zatwierdzone”, ale nie odwrotnie.
To prawda dzisiaj , ale z czasem wszystko się zmienia, dlatego zawsze istnieje możliwość, że firma zdecyduje się na „niezatwierdzenie”, a może jakiś inny status, np. „Zarchiwizowany” itp.
Spójrzmy więc na opcje:
Flaga (a może nawet TINYINT„status”)
- Nieco wolniej w przypadku zapytań o każdy status
- Bardziej elastyczna w czasie / łatwa do wprowadzenia zmiany, takiej jak trzeci stan (np. „Zarchiwizowane”), z nową wartością statusu wyszukiwania. Brak nowej tabeli (koniecznie), trochę nowego kodu, tylko część kodu zaktualizowana.
- Mniej pracy (tj. Kodu, testowania itp.) I mniej miejsca na błędy podczas aktualizacji pojedynczej
TINYINTkolumny
- Mniej skomplikowane = niższe koszty utrzymania w czasie, krótszy czas szkolenia dla nowych pracowników
- (ewentualnie) Mniejszy wpływ na Dziennik transakcji, gdy aktualizowana jest jedna tabela
- Potrzebujesz tylko tabeli odnośników dla „RecordStatus” i FK między dwiema tabelami.
Dwie oddzielne tabele (jedna dla „zatwierdzonych”, jedna dla „niezatwierdzonych”)
- Nieco szybciej dla zapytań o każdy status
- Mniej elastyczne w czasie / trudniejsze do wprowadzenia zmiany, takiej jak stan trzeci (np. „Zarchiwizowane”); nowy stan wymagałby najprawdopodobniej innej tabeli oraz zdecydowanie nowego i zaktualizowanego kodu.
- Więcej pracy (tj. Kodu, testowania itp.) I więcej miejsca na błędy w przenoszeniu rekordów z tabeli „Niezatwierdzone” do tabeli „Zatwierdzone”
- Bardziej skomplikowane = wyższe koszty utrzymania w czasie, dłuższy czas szkolenia dla nowych pracowników
- (ewentualnie) Większy wpływ na dziennik transakcji, ponieważ jedna tabela jest usuwana, a druga wstawiana
- Nie musisz się martwić o „ odnowienie identyfikatora produktu ”: niezatwierdzona tabela ma kolumnę identyfikatora, która jest
IDENTITYkolumną, a tabela zatwierdzona ma kolumnę identyfikatora, która nie jest IDENTITY(ponieważ nie jest tam potrzebna). W związku z tym wartości ID pozostają spójne, gdy rekord przemieszcza się między tabelami.
Osobiście pochyliłbym się w kierunku pojedynczego stołu z StatusIDkolumną na początek. Korzystanie z dwóch tabel wydaje się nadmiernie skomplikowaną, przedwczesną optymalizacją. Tego rodzaju optymalizację można omówić, jeśli / kiedy liczba rekordów wynosi kilkaset milionów, a indeksowanie nie zapewnia żadnego wzrostu wydajności.