Zajmuję się tworzeniem aplikacji, która będzie musiała przechowywać wbudowane , intekstowe metadane. Rozumiem przez to: powiedzmy, że mamy długi tekst i chcemy przechowywać metadane związane z konkretnym słowem lub zdaniem tekstu.
Jaki byłby najlepszy sposób przechowywania tych informacji?
Moją pierwszą myślą było zawarcie w tekście jakiejś Markdown
składni , która następnie byłaby analizowana podczas pobierania. Coś wygląda tak:
Lorem ipsum dolor sit amet, consectetuer adipiscing elit,
sed diam __nonummy nibh__[@note this sounds really funny latin]
euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.
Wprowadziłoby to dwa problemy, o których mogę myśleć:
- Stosunkowo niewielki jest fakt, że jeśli wspomniana składnia przypadkowo znajdzie się na tym tekście, może to zepsuć się podczas analizowania.
- Najważniejsze jest to, że nie utrzymują one tych metadanych oddzielnie od samego tekstu.
Chciałbym mieć dyskretną strukturę danych do przechowywania tych danych, taką inną tabelę DB, w której przechowywane są te metadaty, aby móc ich używać w dyskretny sposób: zapytania, statystyki, sortowanie i tak dalej.
EDYCJA: Ponieważ osoba odpowiadająca usunęła odpowiedź, myślę, że dobrze byłoby dodać tutaj swoją sugestię, ponieważ była to praktyczna sugestia, która rozszerzyła się na tę pierwszą koncepcję. Plakat sugeruje użycie podobnej składni, ale połączenie metadanych PRIMARY KEY
z metadata
tabelą bazy danych.
Coś, co wyglądałoby tak:
Lorem ipsum dolor sit amet, consectetuer adipiscing elit,
sed diam __nonummy nibh__[15432]
euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.
Gdzie 15432
byłby ID
wiersz tabeli zawierający niezbędne, dostępne do zapytania informacje, jak na przykład poniżej.
Moją drugą myślą było przechowywanie tego rodzaju informacji w tabeli DB wyglądającej tak:
TABLE: metadata
ID TEXT_ID TYPE OFFSET_START OFFSET_END CONTENT
1 lipsum note 68 79 this sounds really funny latin
W ten sposób metadane miałyby unikalny identyfikator, text_id
jako klucz obcy podłączony do tabeli przechowującej teksty i łączyłby dane z samym tekstem za pomocą prostego zakresu przesunięcia znaków .
To by załatwiło sprawę, oddzielając dane od metadanych , ale problem, który od razu widzę dzięki temu podejściu, polega na tym, że tekst zasadniczo nie byłby edytowalny . Lub, gdybym chciał zaimplementować edycję tekstu po przypisaniu metadanych, musiałbym w zasadzie obliczyć dodawanie lub usuwanie znaków w porównaniu z poprzednią wersją i sprawdzanie, czy każda z tych modyfikacji dodaje lub usuwa znaki przed lub po każdym powiązanych metadanych.
Co dla mnie brzmi jak bardzo nieeleganckie podejście.
Czy masz jakieś wskazówki lub sugestie dotyczące sposobu rozwiązania problemu?
Edycja 2: niektóre problemy XML
Dodając kolejny przypadek, który byłby niezbędny do tego rozdzielenia danych i metadanych.
- Powiedzmy, że chcę umożliwić różnym użytkownikom posiadanie różnych zestawów metadanych tego samego tekstu , z możliwością lub bez możliwości wyświetlania przez każdego użytkownika metadanych innego użytkownika.
Każde rozwiązanie z wyprzedaży rodzaju (lub HTML lub XML) byłoby trudne do zrealizowania w tym momencie. Jedynym rozwiązaniem w tym przypadku, o którym mogłem pomyśleć, byłoby posiadanie kolejnej tabeli DB, która zawierałaby wersję oryginalnego tekstu dla jednego użytkownika, łączącą się z oryginalną tabelą tekstową za pomocą a FOREIGN KEY
.
Nie jestem pewien, czy to też jest bardzo eleganckie.
- XML ma hierarchiczny model danych: każdy element, który znajduje się w granicach innego elementu, jest uważany za jego element podrzędny , co najczęściej nie występuje w modelu danych, którego szukam; w XML dowolny dzieci element musi być zamknięte przed rodzicem tag może być zamknięty, dzięki czemu bez nakładania się elementów.
Przykład:
<note content="the beginning of the famous placeholder">
Lorem ipsum dolor sit<comment content="I like the sound of amet/elit">
amet</note>
, consectetuer adipiscing elit</comment>
,<note content="adversative?">
sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.<note content="funny latin">
</note>
</note>
Tutaj mamy dwa różne problemy:
Nakładające się różne elementy: Pierwszy komentarz zaczyna się w obrębie pierwszej nuty, ale kończy się po zakończeniu pierwszej nuty, tzn. Nie jest to jej potomek.
Nakładające się te same elementy: ostatnia nuta i pogrubiona nuta nakładają się; jednak ponieważ są one tego samego rodzaju elementem, analizator składni zamknąłby ostatnio otwarty element przy pierwszym zamknięciu, a pierwszy otwarty element przy ostatnim zamknięciu, co w tych okolicznościach nie jest zamierzone.