Czy tabela dziennika powinna otrzymać pole identyfikatora lub klucz podstawowy?

12

Mam tabelę dziennika, która przechwytuje znacznik daty i godziny, kiedy niektóre pliki zostały wyeksportowane do innego systemu.

Tabela exportedLog ma obecnie trzy pola:

id                (primary key)
messageId         (int)
exportedDateTime  (datetime)

Przeglądając to stwierdziłem, że idpole nie ma żadnego sensu, ponieważ nie ma połączeń do tej tabeli. Jedyną rzeczą działającą na tej tabeli jest wstawienie zadania wsadowego, które przetwarza komunikaty i wstawia do tej tabeli dziennika.

Czy powinienem usunąć idpole?

Powinienem mieć klucz podstawowy po obu messageIdalbo exportedDateTimeczy jedno i drugie?

kacalapy
źródło
2
Dla którego DBMS to jest?
ypercubeᵀᴹ

Odpowiedzi:

10

Czy powinienem usunąć pole identyfikatora?

Poleciłbym to zatrzymać.

Być może nie potrzebujesz tego pola teraz , ale w przyszłości może naprawdę ci pomóc - co zrobić, jeśli będziesz musiał przechowywać szczegóły plików dla każdego wpisu dziennika?

Nie wiem, jak duża będzie ta tabela i jak szybko, ale dodanie kolumny do dużej tabeli jest zwykle kosztowną operacją. Jeśli stół jest stosunkowo mały, nie jest to wielka sprawa, jeśli chodzi o przestrzeń do przechowywania. IMO, zachowaj kolumnę i zapisz potencjalny ból głowy później.

Czy powinienem mieć klucz podstawowy na messageId lub exportedDateTime, czy na oba?

Nie brzmi to tak, jakby messageIdsam był unikalny w tej tabeli (choć mogę się mylić), a tworzenie unikatowości w samej kolumnie daty / godziny może potencjalnie tworzyć duplikaty (a zatem błędy). Pozostała tylko opcja z 2 kolumnami, co nie jest szczególnie atrakcyjne, biorąc pod uwagę powyższy scenariusz.


Zasadniczo, moim celem tej odpowiedzi jest to, że utrzymanie kolumny nie jest wielką sprawą (zakładam), ale potrzebowanie jej później może być wielką sprawą i / lub wymagać dodatkowej pracy, aby ją przywrócić.

Jon Seigel
źródło
6
  • Jeśli nie masz złączeń na tym stole, żadnych aktualizacji i żadnych usunięć, to w ogóle nie potrzebujesz kluczy.

  • Jeśli tak nie jest i messageIdjest unikalny, możesz uczynić go kluczem podstawowym.

  • Jeśli nie jest unikalny, ale (messageId, exportedDateTime)jest, uczyń go złożonym kluczem podstawowym.

  • Jeśli nawet (messageId, exportedDateTime)połączenie może dać duplikaty oraz aktualizacji i konieczna Usuwa (powiedzmy usunąć przypadkowo wstawionych wierszy), to lepiej pozostawić idpole jak jest.

dezso
źródło
0

Klucz podstawowy nie zaszkodzi ... jeśli weźmiesz pod uwagę cel dziennika / audytu, prawdopodobnie zostanie on użyty (zapytany) w przyszłości w celu rozwiązania problemu lub przywrócenia danych itp. I prawdopodobnie zostanie dołączony do innego istniejące tabele niebędące dziennikami / audytami do wykonywania tego rodzaju pracy.

Mark E.
źródło