2010-02-08 16 views
26

Szukałem rozwiązania bazodanowego, aby umożliwić zdefiniowanie przez użytkownika pól i wartości (pozwalając na nieograniczoną liczbę). Na pierwszy rzut oka wydawało się, że EAV jest odpowiedni, ale po pewnym lekturze nie jestem już pewien.Baza danych Zalety/wady i alternatywy EAV

Jakie są plusy i minusy EAV?

Czy istnieje alternatywna metoda bazy danych umożliwiająca zdefiniowane przez użytkownika atrybuty/pola i wartości?

+0

Zobacz http://stackoverflow.com/search?q=%5bdatabase%5d%20%2beav&tab=newest –

Odpowiedz

27

Nie należy traktować tego jako wyczerpującej odpowiedzi, ale tylko kilka punktów na ten temat.

Ponieważ pytanie jest również oznaczone tagiem [sql], proszę pozwolić mi powiedzieć, że ogólnie rzecz biorąc, relational databases nie są szczególnie odpowiednie do przechowywania danych przy użyciu modelu EAV. Nadal możesz zaprojektować model EAV w SQL, ale będziesz musiał poświęcić wiele zalet, które dałaby relacyjna baza danych. Nie tylko nie będziesz w stanie wymuszać integralności referencyjnej, używać typów danych SQL dla wartości i wymuszać obowiązkowych atrybutów, ale nawet bardzo podstawowe zapytania mogą być trudne do napisania. W rzeczywistości, aby pokonać to ograniczenie, kilka rozwiązań EAV polega na powielaniu danych, zamiast łączenia się z powiązanymi tabelami, które, jak można sobie wyobrazić, mają wiele wad.

Jeśli naprawdę potrzebujesz zaprojektowanego przez siebie szablonu, "pozwalającego na nieograniczoną liczbę atrybutów", najlepiej jest użyć rozwiązania NoSQL. Mimo że słabości EAV w stosunku do relacyjnych baz danych mają również zastosowanie do alternatyw NoSQL, otrzymasz dostęp do dodatkowych funkcji, które są trudne do osiągnięcia dzięki konwencjonalnym bazom danych SQL. Na przykład, zwykle magazyn danych NoSQL można skalować znacznie łatwiej niż relacyjne bazy danych, po prostu dlatego, że zostały zaprojektowane w celu rozwiązania pewnego problemu skalowalności i celowo usunięto funkcje, które utrudniają skalowanie.

Wiele platform cloud computing (takie jak te oferowane przez Amazon, Google i Microsoft) są wyposażone magazynów danych w oparciu o model EAV, gdzie dowolna liczba atrybutów mogą być związane z danym podmiotem. Jeśli zastanawiasz się nad wdrożeniem aplikacji w chmurze, możesz uznać ją zarówno za przewagę biznesową, jak i techniczną, ponieważ silna konkurencja między dużymi dostawcami przesuwa stosunek wartości do kosztów na bardzo wysokie poziomy, poprzez ciągłe zwiększanie funkcjonalności i obniżanie kosztów finansowych i wdrożenia.

+10

Nie widzę, jak EAV jest przewagą techniczną: jej bardziej skomplikowana budowa, zapytanie i wstawianie, a czytelność jest bardzo niska. To, co byłoby prostym i szybkim "select * from", staje się wolnym pytaniem SQL. I nawet nie mówię o próbach tworzenia raportów na podstawie modelu EAV. – guigui42

+0

@ guigui42: Dzięki za komentarz. Masz rację, ale moja odpowiedź nie miała być wyczerpująca. Niemniej jednak, ponieważ został oznaczony jako zaakceptowany przez PO, zaktualizowałem odpowiedź z kilkoma dodatkowymi uwagami. –

+1

Jestem nieco zdezorientowany na temat "egzekwowania integralności referencyjnej". Używam EAV i mam wiele kluczy obcych. Wiele typów danych SQL może być używanych dzięki UNION ALL i niektórym meta-danym, które mapują atrybuty do tabeli (typu danych), w której są przechowywane. Możesz znacznie poprawić szybkość zapytań poprzez dodanie dodatkowych indeksowanych kolumn do tabeli encji (np. 'na przykład). –

-9

Czy istnieje alternatywna metoda bazy danych umożliwiająca zdefiniowane przez użytkownika atrybuty/pola i wartości?

Jedną z opcji jest zmiana schematu bazy danych na podstawie danych wprowadzonych przez użytkownika: na przykład, gdy użytkownik chce nowego pola, a następnie dodać odpowiednią kolumnę do bazy danych.

+2

Wadą tego jest to, że będziesz miał mnóstwo pustych pól. –

+1

@ Chris: Scenariusze, w których jest to wykonalne, są moim zdaniem bardzo ograniczone. –

+0

Niektóre bazy danych obsługują kolumny "rzadkie" (na przykład SQL Server), które sprawiają, że podejście to jest nieco bardziej funkcjonalne. – codeulike