5

Czy widzisz reguły wywoływania bazy danych/reguły integralności referencyjnej używane w sposób zmieniający rzeczywiste dane w bazie danych (zmiana wiersza w w tabeli x powoduje zmianę wiersza y w tabeli z)?Wyzwalacze bazy danych/integralność referencyjna i buforowanie w pamięci

Jeśli tak, w jaki sposób wiąże się to z rosnącą popularnością buforowania w pamięci (memcache i przyjaciele)? Wszakże te działania występują wewnątrz bazy danych, ale system buforowania musi ich znać, aby odzwierciedlić poprawny stan (lub przynajmniej unieważnić ewentualnie zmieniony stan). Trudno mi uwierzyć, że w takich przypadkach stosowane są wywołania zwrotne.

Czy ktoś ma doświadczenie w świecie rzeczywistym z takim doświadczeniem setup/świecie rzeczywistym z uwzględnieniem taką konfigurację i porzucenie go (w którą stronę poszedłeś? Czy buforowanie, jak można wymusić integralności?)

Odpowiedz

5

prosta odpowiedź:

  • Więzy integralności jest musi mieć
  • buforowania jest kwalifikacje musi mieć
  • wyzwalacze są miło mieć

Dłuższa odpowiedź

Byłem tworzenia aplikacji na relacyjnych bazach danych od 1993 roku (DEC RDB skoro pytasz, a na płaskich systemów plików wcześniej) a wyzwalacze nigdy nie były popularne wśród wielu programistów, ponieważ mogą "usuwać rzeczy, których nie chcesz usuwać". Wzajemna integralność jest często źle widziana przez programistów, ponieważ baza danych w trzeciej normalnej formie o właściwej integralności referencyjnej jest trudna do zebrania razem w ciągu kilku minut.

Buforowanie jest często uważane za dość "trudne", ale nie jestem pewien dlaczego.

Podczas gdy wiele systemów może żyć bez wyzwalaczy, powiedziałbym, że żadna baza danych aplikacji nie może wygodnie przetrwać bez referencyjnej integralności. Spójrz na tagi na to pytanie, baza danych za tą witryną będzie zawierała tabelę dla tagów (prawdopodobnie zwaną "Tag") i pytania (prawdopodobnie nazywane "Pytanie"). „Pytanie” będzie mieć klucz obcy do klucza podstawowego w tabeli tagów, ale może mieć wiele pytań i znaczniki mogą mieć wiele pytań Przypuszczam, że związek jest tak:

Question 
    (TagId)   1 | Database triggers/referential integrity and in-memory caching 
     | 
    ----- 
    | | | 
    QuestionTag 
(QuestionId)  1 | 1 ... 1 | 2 ... 1 | 3 ... 
    (TagId) 
    | | | 
    ----- 
     | 
    Tag   1 | database ... 2 | referential-integrity ... 3 | triggers ... 
    (TagId) 

Ten rodzaj integralności referencyjnej jest podstawą każdej rzetelnej aplikacji i nie podlega negocjacjom. Możesz zobaczyć, w jaki sposób zwiększa wiarygodność projektu aplikacji i pewność jej długowieczności.

Buforowanie w SO może być włączone dla czegoś takiego jak znaczniki (choć nie jest to gwarantowane), więc zakładaj, że znaczniki są przechowywane w pamięci podręcznej i masz wystarczającą reputację, aby móc dodać znacznik do SO . Dodajesz swój tag i może on zostać utrwalony w bazie danych natychmiast - ale czy pamięć podręczna jest następnie aktualizowana?

To, co masz, to kompromis. Czy strona może przetrwać bez wiedzy o nowym tagu? A jeśli tak, to jak długo? Zasadniczo, jaki jest cykl życiowy tagu, ponieważ postępuje on od dodania przez użytkownika do bazy danych, dostępnej dla innych użytkowników, wykorzystywanej przez innych użytkowników?Pamięć podręczna zostanie odbudowana zgodnie z zasadami określonymi przez zespół programistów - i ta reguła będzie zasadniczo kompromisem, aby każdy nowy znacznik był dostępny wystarczająco szybko, bez spowalniania działania aplikacji.

Wyzwalacze mogą wymuszać integralność referencyjną, np. Dodawana etykietka to "śmieci", ale do czasu, gdy administratorzy zobaczą ją, trzy pytania oznaczone są "śmieciami". Administratorzy następnie decydują się usunąć znacznik "śmieci" - ale co z pytaniami, które są z nim oznaczone? Jeśli istnieje wyzwalacz w tabeli "tagów", która jest uruchamiana przy usuwaniu, może wtedy uruchomić tabelę "pytanie" i usunąć wszystkie odniesienia do "śmieci". Istnieje wiele alternatyw dla tego podejścia - z których wiele to programowe rozwiązania - ale czy istnieje czystsza alternatywa?

Pracowałem na wielu stronach w ciągu ostatnich 20 lat, dobre używają integralności referencyjnej i coraz częściej buforują. Wyzwalacze, które zmieniają dane anonimowo (wszystko, co zasadniczo są to oparte na zdarzeniach procedury przechowywane), nie są popularne i coraz częściej niezrozumiane, ale nadal odgrywają pewną rolę.

Nie można uznać, że pamięć podręczna i integralność referencyjna to jedna lub dwie, a zespoły programistów muszą projektować aplikacje, aby można je było uwzględnić.

+0

Wow, dobrze przemyślana odpowiedź. Jednak nadal nie mogę zrozumieć, jak działające w pamięci rozwiązania do buforowania działają z aktualizacjami "zza kulis". Każda zmiana zasad odwoływania się do bazy danych może potencjalnie stworzyć ogromną dziurę w rozwiązaniu buforującym. W jaki sposób są pogodzone te wymagania (czy szybko - pamięć podręczna, spójność - wymuszenie zgodności)? –

+0

Buforowanie "na półce" jest kwestią konfiguracji, z ładowaniem zmian bazy danych i samą pamięcią podręczną, znającą referencyjne ograniczenia integralności w bazie danych. Oznacza to, że nawet buforowane dane będą odrzucać próby złamania integralności referencyjnej. – amelvin

+0

Naprawdę? gotowe rozwiązania buforowania wiedzą o integralności referencyjnej? Nie mogłem znaleźć żadnego odniesienia do tego w popularnych systemach buforowania - czy możesz skierować mnie do tego, który to robi? –