Jestem odpowiedzialny za utworzenie bazy danych projektu. Mamy pola, które rzadko mają wartość (1 na 10 000 rekordów) i staram się znaleźć najlepszy sposób przechowywania tego w bazie danych.
O ile widzę, mam 3 opcje:
- Dodaj kolumnę w tabeli dla każdej dodatkowej wartości
- Dodaj połączoną tabelę, która odwołuje się do oryginalnej tabeli i ma rekordy tylko tam, gdzie musimy przechowywać wartość
- Użyj typu danych XML w oryginalnej tabeli i zapisz w nim wszystkie wartości.
Czy są jakieś inne opcje, których nie rozważałem?
Próbuję wypracować zalety i wady każdej metody. O ile mogę stwierdzić, 1 będzie najłatwiejszy, a 2 zajmie najmniej miejsca, ale staram się znaleźć wiele zasobów dla 3.
sql-server-2008
xml
Matthew Steeples
źródło
źródło
Odpowiedzi:
Wydaje się, że to, czego potrzebujesz, to rzadkie kolumny i przefiltrowane indeksy i przejdź do opcji 1. Są to w pełni obsługiwane i udokumentowane funkcje dokładnie dla tego scenariusza.
Nie wyobrażam sobie, aby rozwiązanie XML działało dobrze w tym scenariuszu, będzie miało ogromny narzut redundantnych metadanych i będzie powolne w wyszukiwaniu.
źródło
Nullable kolumna nie zajmuje miejsca, jeśli zmienna długość w SQL Server. Fakt bycia NULL jest przechowywany w bitmapie NULL . W razie potrzeby można go zindeksować za pomocą filtrowanych indeksów, aby zignorować kolumny NULL.
Dodaje złożoności, gdy weźmiesz pod uwagę punkt 1.
Nie rób Trudno wyszukiwać, analizować etc: ty będziesz tego żałował później
Zależy to również od rozmiaru: czy będzie to char (1000) dla kilku miliardów wierszy? Lub tinyint na 100 000 wierszy? Jeśli to drugie weźmie pod uwagę dodatkową złożoność punktu 2: nie warto.
źródło
W SQL Server 2008 masz dodatkową opcję korzystania z rzadkich kolumn, które zostały zaprojektowane specjalnie dla wspomnianej sytuacji.
Ich dodatkową zaletą jest to, że można je wyświetlać jako połączony obiekt XML za pomocą XML COLUMN_SET lub odwoływać się do nich indywidualnie, a także zapewniają ogromną oszczędność miejsca.
Sprawdź następujący artykuł na blogu, aby uzyskać więcej informacji: http://www.sqlskills.com/BLOGS/PAUL/post/SQL-Server-2008-Sparse-columns-and-XML-COLUMN_SET.aspx
źródło
Czwarta opcja: nie używaj tabel. Tabele są bardzo źle dostosowane do tego rodzaju danych (w rzeczywistości do wszelkiego rodzaju danych, które nie zostały przymusowo dopasowane w formie tabelarycznej). Wystarczy użyć XML.
źródło