Cześć dopiero od krótkiego czasu zajmuję się projektowaniem i tworzeniem baz danych w MS SQL. Mam już troszkę wprawy i nurtuje mnie pewne pytanie. Z tego co pamiętam to wyszukiwanie w bazie danych w tabeli po kluczu głównym zajmuje tyle co nic bo po kluczu głównym mamy dostęp automatyczny do danego wiersza. Jeżeli jestem w tym przekonaniu w błędzie to prosił bym o sprostowanie. Kontynuując załóżmy, że mamy tabele produktów z miliardem wierszy. Tabela jest tak zaprojektowana, że prawdopodobnie każdy użytkownik odnosi się jedynie do jednego z tych produktów. Jednak istnieje możliwość, że będą użytkownicy, którzy chcą być powiązani z kilkoma np max do 20 produktów. Od tego momentu zaczyna się mój dylemat.
Oto dwa rozwiązania miedzy którymi się zastanawiam.
- Każdy produkt ma referencje do swojego użytkownika i po odpowiednim zapytaniu, baza przeszukuje tabelę miliarda wierszy wypisując listę produktów, z którymi dany użytkownik był powiązany.
Skoro takie zapytanie nie dotyczy już klucza głównego produktu, a zamiast tego dotyczy pola użytkownik w tabeli produktów. To wydaje mi się, że baza z takim zapytaniem musi przejść przez wszystkie miliard wierszy tabeli (co może być dość pracochłonne) i następnie wyświetla listę produktów.
To rozwiązanie jest pewnie dość standardowe dla małych baz
- Drugim rozwiązaniem jest utworzenie tabeli użytkowników z referencją na ich pierwszy produkt. Tabela produktów będzie natomiast zawierać referencję do innego produktu. W takim przypadku zakładając, że znamy już klucz użytkownika to po tym kluczu automatycznie dostaniemy klucz główny pierwszego produktu. Jeżeli użytkownik będzie miał tylko jeden produkt to referencja z tego produktu będzie wskazywać na klucz produkt "0" i na tym działanie programu się skończy. Jeśli użytkownik ma kilka produktów to przechodzimy przez jego produkty jak przez listę za każdym razem otrzymując klucz główny następnego produktu.
Takie rozwiązanie sprawia, że jeśli miał bym tabelę z przynajmniej miliardem produktów przeszedł bym przez te jedynie kilka produktów użytkownika za każdym razem używając klucza głównego i nie musiał bym sprawdzać jak wcześniej całego miliarda wierszy.
Mam nadzieje, że dobrze opisałem problem.
Pamiętając więc o tym, że nasza tabela ma bardzo wiele rekordów, prawdopodobnie miliard jest tutaj zaniżoną liczbą.
Tak więc na jakie rozwiązanie powinienem się zdecydować?
z góry dzięki za odpowiedź