2009-10-16 23:38 / marek / 0 komentarzy
Zgodnie z obietnicą tym razem opiszę nieco bardziej zaawansowane możliwości definiowania ograniczeń na poziomie bazy danych. Naszą ulubioną bazą jest PostgreSQL, zatem przykłady będą oparte właśnie na niej - niemniej przynajmniej niektóre z tych mechanizmów są również zaimplementowane w innych RDBMS.
CHECK to prosty constraint pozwalany na sprawdzanie jakiegoś warunku. Nie wiem, jak jest to naprawdę wewnętrznie zaimplementowane w PostgreSQL, ale wydaje mi się, że NOT NULL może być właśnie takich checkiem. Oto przykład definicji takiego constrainta:
ALTER TABLE posts ADD CONSTRAINT valid_post_type CHECK (type in ('Rumor', 'NewsArticle'))
Jak widać sprawdzamy, czy pole type tabeli posts zawiera się w tablicy dopuszczalnych wartości. Zastosowanie takiego konkretnego constrainta jest oczywiste - zapobiega on istnieniu rekordów nienależących do istniejących podklas w modelu STI (które mogłyby powstać np. w wyniku usunięcia jakiejś podklasy albo ręcznych zmian w bazie
2009-09-16 21:59 / marek / 0 komentarzy
Po tym nieco przewrotnym tytułem chciałem opisać parę słów na ten tzw. constraintów w bazie danych, których najczęściej spotykanym przykładem są właśnie klucze obce. Jak donosi Google, twórcy Rails nie są wielkimi fanami tychże, zresztą najlepszym dowodem jest brak wsparcia dla FK (Foreign Keys) w defaultowej dystrybucji RoR - potrzebne są pluginy takie jak redhillonrails_core (polecam zresztą również inne pluginy tej firmy). W niniejszym artykule postaram się udowodnić, iż ludzie odpowiedzialni za stworzenie tak niezwykłego frameworka jak Rails mogą się również mylić, i to bardzo.
Ich najważniejszym zastosowaniem jest zachowanie tzw. referential integrity, czyli spójności powiązań pomiędzy tabelami w bazie danych. Weźmy oklepany przykład:
class Post
Jeśli nie mamy założonych kluczy obcych na polu post_id tabeli comments, to nie mamy pewności, iż znajdująca się w tej kolumnie wartość odnosi się do istniejącego posta! Oczywiście, taka możliwość
2009-09-05 14:59 / marek / 0 komentarzy