Jak przechowywać metadane w kolumnach
Powiedzmy, że zbierasz informacje poufne o nadchodzących wydaniach filmów o superbohaterach, a twój główny stół filmowy wygląda mniej więcej tak:
Tabela 1
<code>Title Director Leading Male Leading Female Villain -------------------------------------------------------------------------- Green Lantern Kubrick Robert Redford Miley Cyrus Hugh Grant The Tick Mel Gibson Kevin Sorbo Linda Hunt Anthony Hopkins </code>
Powinno to działać bardzo dobrze na ogół i umożliwiać bardzo łatwe zapytania oraz porównywanie wierszy.
Jednak chciałbyś śledzić źródło każdego faktu na temat danych, a także nazwisko dziennikarza, który odkrył ten fakt. To wydaje się sugerować coś w rodzajuEAV taki stół:
Tabela 2
<code>Movie Attribute Value Source Journalist ---------------------------------------------------------------------------------- Green Lantern Director Kubrick CHUD Sarah Green Lantern Leading Male Robert Redford CHUD James Green Lantern Leading Female Miley Cyrus Dark Horizons James Green Lantern Villain Hugh Grant CHUD Sarah The Tick Director Mel Gibson Yahoo Cameron ... </code>
Co, chociaż łatwo przechwytuje meta-dane, które chcieliśmy, sprawia, że zapytania są trudniejsze. Wystarczy trochę więcej, aby uzyskać wszystkie podstawowe dane pojedynczego filmu. Mówiąc dokładniej, musisz mieć do czynienia z czterema wierszami, aby uzyskać cztery ważne informacje o Zielonej Latarni, podczas gdy w tabeli 1 jest to pojedynczy, ładnie zamknięty rząd.
Zatem moje pytanie brzmi, w świetle komplikacji, które właśnie opisałem, a ponieważ ogólnie wiem, że należy unikać tabel EAV, czy EAV jest nadal najlepszym rozwiązaniem? Wygląda na to, że jest to jedyny rozsądny sposób reprezentowania tych danych. Jedyną inną alternatywą, jaką widzę, jest użycie tabeli 1 w połączeniu z inną, któratylko zawiera takie dane meta:
Tabela 3
<code>Movie Attribute Source Journalist ---------------------------------------------------------------------------------- Green Lantern Director CHUD Sarah Green Lantern Leading Male CHUD James Green Lantern Leading Female Dark Horizons James Green Lantern Villain CHUD Sarah The Tick Director Yahoo Cameron ... </code>
Jest to jednak bardzo niebezpieczne, ponieważ jeśli ktoś zmieni nazwę kolumny w tabeli 1, np. „Villain” na „Primary Villain”, wiersz w tabeli 3 nadal będzie po prostu mówił „Villain”, a zatem powiązane dane zostaną niestety oddzielone. Mogłoby to pomóc, gdyby kolumna „atrybut” była połączona z inną tabelą, która posłużyła za wyliczenie kolumn tabeli 1. Oczywiście administrator DBA byłby odpowiedzialny za utrzymanie tej tabeli wyliczeń w celu dopasowania do rzeczywistych kolumn tabeli 1. I w rzeczywistości możliwe byłoby nawet dalsze ulepszenie tego, zamiast ręcznego tworzenia tabeli wyliczeń, użyj widoku systemowego w SQL Server, który zawiera nazwy kolumn w tabeli 1. Chociaż nie jestem pewien, czy możesz mieć relacje, które dotyczą widoki systemowe.
Co sugerujesz? Czy EAV to jedyny sposób na to?
A co jeśli to była tylko jedna kolumna metadanych (tylko „Źródło” bez „Dziennikarza”) - czy nadal jest konieczne przejście na trasę EAV? Możesz mieć kolumny „Director”, „Director_Source”, „Leading Male”, „Leading Male_Source” itp., Ale to bardzo brzydko robi się bardzo szybko. Czy jest jakieś lepsze rozwiązanie, o którym nie myślę?
Jeśli nie wyjaśniłem żadnego punktu, skomentuj, a dodam więcej, jeśli to konieczne. O tak, a dane filmowe, których użyłem, są sfabrykowane :)
Edycja: Aby zwięźle podsumować moje podstawowe pytanie, chciałbym mieć prostotę i prawdziwy projekt RDBMS tabeli 1, który naprawdę dobrze opisuje wpis filmu, jednocześnie zachowując metadane na atrybutach w bezpieczny i dostępny sposób. czy to możliwe? Czy EAV to jedyny sposób?
Edytuj 2: Po przeprowadzeniu dalszych badań internetowych, nie znalazłem jeszcze dyskusji na temat EAV, która skupiała się na chęci przechowywania metadanych w kolumnach. Podstawowym powodem wprowadzenia EAV są prawie zawsze dynamiczne i nieprzewidywalne kolumny, co nie ma miejsca w moim przykładzie. W moim przykładzie zawsze są te same cztery kolumny: dyrektor, główny mężczyzna, wiodąca kobieta, czarny charakter. Jednak chcę przechowywać pewne fakty (źródło i dziennikarz) o każdej kolumnie dla każdego wiersza. EAV ułatwiłoby to, ale chciałbym uniknąć uciekania się do tego.
Aktualizacja
Korzystanie z projektu tabeli 2, z wyjątkiem zmiany nazwy kolumny „Film” na „Nazwa” i wywołanie całej tabeli „Film”, jest tutaj operacją przestawną w SQL Server 2008, aby odzyskać tabelę 1:
<code>SELECT Name, [Director], [Leading Male], [Leading Female], [Villain] FROM (Select Name, Attribute, Value FROM Movie) as src PIVOT ( Max(Value) FOR Attribute IN ([Director], [Leading Male], [Leading Female], [Villain]) ) AS PivotTable </code>