Obecnie mamy istniejącą bazę danych i aplikację, która jest w pełni funkcjonalna. W tym momencie nie mam możliwości zmiany architektury. Dzisiaj każda tabela w bazie danych ma pole „IsDeleted” NOT NULL BIT z domyślną wartością „0”. Gdy aplikacja „usuwa” dane, po prostu aktualizuje flagę IsDeleted na 1.
Trudno mi zrozumieć, w jaki sposób należy ustrukturyzować indeksy w każdej tabeli. W tej chwili każde zapytanie / dołącz / etc zawsze implementuje kontrolę IsDeleted. Jest to standard, którego muszą przestrzegać nasi programiści. Biorąc to pod uwagę, próbuję ustalić, czy wszystkie moje klastrowane indeksy klucza podstawowego w każdej tabeli muszą zostać zmienione, aby uwzględnić klucz podstawowy ORAZ pole BIT IsDeleted. Również od KAŻDEGO zapytania / dołączenia / etc. musi zaimplementować kontrolę IsDeleted, czy właściwe jest założenie, że KAŻDY POJEDYNCZY indeks (również niesklastrowany) powinien zawierać pole IsDeleted jako pierwsze pole indeksu?
Mam jeszcze jedno pytanie dotyczące przefiltrowanych indeksów. Rozumiem, że mogłem umieścić filtry w indeksach, takie jak „WHERE IsDeleted = 0”, aby zmniejszyć rozmiar indeksów. Ponieważ jednak każde sprzężenie / zapytanie będzie musiało zaimplementować kontrolę IsDeleted, czy uniemożliwiłoby to użycie filtrowanego indeksu (ponieważ kolumna IsDeleted jest używana w sprzężeniu / zapytaniu)?
Pamiętaj, że nie mam możliwości zmiany podejścia IsDeleted.
IsDeleted
kolumny, niezależnie od fizycznego przechowywania, prawdopodobnie sensowne byłoby ujawnienie danych przez dwa widoki (opcjonalnie w różnych schematach), rozwiązując zarówno problem parametryzacji, jak i popełniając błędy przy dostępie do danych, które nie powinny były być dostęp jest mniej prawdopodobny. Dostęp do danych podstawowych ma znaczenie tylko w rzadkich przypadkach, w których usunięte i nieskasowane dane muszą być w jakiś sposób połączone, a wiersze faktycznie muszą zostać przełączone na „usunięte”.