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>

questionAnswers(9)

yourAnswerToTheQuestion