Czy przechowywanie informacji o metadanych w nazwach plików jest złą praktyką? Lepsze rozwiązania?

13

Zauważyłem, gdzie pracuję, ludzie chętnie przechowują informacje w nazwach plików i analizują nazwy plików.

Nie wydaje mi się to szczególnie dobrą praktyką. Widzę już sporadyczne problemy ze skryptami globującymi plik i mylącym się, ponieważ inny plik jest dopasowywany jako pierwszy. Dyskutujemy również, jak obejść problemy z separatorami pól.

Czy jest to uważane za złą praktykę, czy nie?

Jakie są inne akceptowane rozwiązania dotyczące pobierania plików z systemu plików na podstawie pewnego rodzaju metadanych?

wobbily_col
źródło
Wiele zależy od tego, co dokładnie jest przechowywane w nazwie pliku. Czy możesz podać nam kilka przykładów?
T. Sar

Odpowiedzi:

14

Tak, myślę, że to zła praktyka. Podlega on wszelkiego rodzaju problemom - na przykład limitom długości, problemom z kodowaniem i konfliktom wynikającym z powielania danych.

Lepiej jest użyć „pliku głównego” (czasami nazywanego manifestem lub indeksem), który zawiera metadane i ścieżki do plików. Lub coś podobnego w bazie danych, rejestrze lub czymś podobnym. Lub umieścić metadane w rzeczywistych plikach, na najwyższym poziomie struktury danych zawartej w pliku, na przykład JSON lub XML.

Jest to nieco analogiczne do koncepcji umieszczania informacji lub kluczy przestrzeni nazw w magazynach klucz-wartość. Myślę, że jest to w porządku, o ile używasz go tylko do przestrzeni nazw i szybko wyszukujesz - nie ma tam kluczowych składników, które mogłyby dostarczyć parsowalne informacje. Jeśli potrzebujesz tych informacji, skopiuj je do wartości (plik w powyższym przypadku).

Magnus Wolffelt
źródło
3
Podnosisz punkty jelitowe. Są jednak sytuacje, w których mimo wszystko sensowne jest umieszczenie informacji w nazwie pliku. Pomyśl o załącznikach poczty, które muszą być kierowane lub przetwarzane w sposób oparty na regułach. Jeśli wiele równoległych procesów musi zmienić plik główny, może to stać się wąskim gardłem.
Axel Kemper
Jako programista bazy danych naturalnie myślę o użyciu bazy danych zamiast pliku manifestu (jeden z powodów, dla których tutaj pytam o alternatywne metody). To rozwiązałoby problem równoczesnego dostępu, ale jest bardziej złożonym rozwiązaniem.
wobbily_col
1
@wobbily_col, w zależności od używanego systemu, może być dostępna obsługa rozszerzonych atrybutów plików .
Hellion
@AxelKemper Jest tylko tyle informacji, które można zmieścić w nazwie. Jest więcej metadanych niż nazwisko i autor.
Tulains Córdova
Nie wspominając o nazwach plików, może je zmienić ktoś spoza twojego systemu, łamiąc wszelkie oczekiwane formaty. Nawet jeśli masz egzekwowane odpowiednie uprawnienia do plików, ostatecznie jest to kruche rozwiązanie.
Berin Loritsch,
5

Po pierwsze, metadane to rozmyta koncepcja.

To powiedziawszy, wiele przypadków metadanych w plikach już istnieje:

  • numery wersji bibliotek
  • data i godzina zdjęć lub przynajmniej indeks sekwencji
  • typ pliku, który uruchamia aplikację, która powinna otworzyć plik
  • nazwa katalogu domowego, która musi być nazwą użytkownika sesji

Niemniej jednak ta krótka lista nie jest argumentem za praktyką.

Alternatywami są:

  • obsługiwać metadane na poziomie FS, na przykład stary Apple HFS
  • wstaw metadane do samego pliku, np. Exif dla obrazów lub ID3 dla dźwięków
  • umieść metadane w innym pliku lub bazie danych, jak większość menedżerów multimediów.
mouviciel
źródło
5
Wszystko jest niewyraźne. Nawet „rozmyte”, „koncepcja” i „wszystko” są rozmytymi pojęciami.
Tulains Córdova
3

Wygląda na to, że potrzebujesz bazy danych.

Istnieje wiele problemów bezpieczeństwa związanych z umieszczaniem danych użytkownika w nazwach plików. Załóżmy, że masz plik dla każdego użytkownika („username.txt”). To, co się stanie, gdy ktoś zarejestruje nazwę użytkownika „../../../../etc/passwd”, zależy od tego, jak filtrujesz dane wejściowe użytkownika.

Frameworki baz danych czasami pomagają w odkażaniu danych wprowadzanych przez użytkowników.

Eric Wimberley
źródło
W rzeczywistości wiele systemów operacyjnych przechowuje nazwy użytkowników w nazwach katalogów, które nazywane są katalogami domowymi .
mouviciel
To dlatego, że niektóre programy muszą znajdować się na dole stosu. Nie oznacza to, że wszyscy muszą pracować na tym poziomie. Nie zamierzam argumentować o zaletach baz danych, ponieważ programiści używają ich od ponad 50 lat.
Eric Wimberley,
1
@mouviciel Nie znam żadnego systemu operacyjnego, który analizuje nazwę użytkownika poza nazwą katalogu domowego użytkownika. Zarówno Windows, jak i systemy uniksowe przechowują nazwę katalogu w jakiejś bazie danych i ładują ją do środowiska, gdy użytkownik się loguje. W obu systemach możesz skończyć z nazwą katalogu domowego inną niż nazwa użytkownika ( np. zmiana nazwy użytkowników lub jeśli masz dwie instancje systemu Windows na tej samej partycji systemowej).
Jules
2

Nie ... no cóż ... niekoniecznie.

Tak długo, jak masz ścisłą konwencję i powszechnie dostępne środki analizy i sprawdzania poprawności (skrypty, biblioteki itp.), Możesz iść.

Weźmy na przykład systemy zarządzania pakowaniem i zależnościami (Maven, NuGet i podobne). Chociaż wiele osób używa określonych plików metadanych do przechowywania bardziej zaawansowanych informacji, podstawowe informacje są często częścią samej nazwy pliku. Opierając się na ścisłych konwencjach, nazwa pliku może zawierać najistotniejsze informacje o pakiecie: jego dostawca, nazwa, wersja, typ. Czasami to wszystko, czego potrzebujesz ... 4 lub 5 krótkich informacji.

Jeśli metadane są proste, wówczas konwencja nazewnictwa plików ma sens i nie wymaga niczego. Można go wzmocnić za pomocą bardzo prostych narzędzi i skryptów, niepotrzebnej bazy danych, specjalistycznej infrastruktury, tylko kilka skryptów i konwencji nazewnictwa.

Jeśli nic tam nie robi, czego potrzebujesz, a twoje potrzeby są proste, zacznę od tego.

Twoje wymagania przerastają tę konwencję? rozszerz go o odpowiedni plik metadanych. Później potrzebujesz lepszego wyszukiwania? Istnieją już dobre rozwiązania do wyszukiwania plików, które zaprowadzą Cię tam, gdzie potrzebujesz.

Nie chodzi o to, że nie lubię baz danych, wręcz przeciwnie, są one naprawdę potężne i użyteczne, ale wymagają pewnego nakładu pracy, aby zacząć. Muszą być instalowane, archiwizowane, utrzymywane, będziesz potrzebował personelu, który, jeśli nie będzie całkowicie poświęcony, będzie musiał poświęcić część swojego czasu na tę infrastrukturę. Są również bardziej złożone i tajemnicze dla laików, stracą twórcę, który cię skonfigurował, a twój system utknie w czasie, aż znajdziesz zastępcę.

Nigdy nie lekceważ potęgi niskiej technologii z odpowiednim nadzorem, który może zapewnić ci długą drogę.

A zanim wyrosniesz z niskonakładowego rozwiązania, zgromadzisz całe doświadczenie i wymagania, aby wdrożyć idealny system dla swoich potrzeb.

Newtopian
źródło
Nigdy nie lekceważ siły bezwładności. Zmiana niskiego poziomu technologii na coś bardziej niezawodnego wymaga o wiele więcej wysiłku niż po prostu nie robienie tego w ten sposób.
Berin Loritsch,
1
@BerinLoritsch ten sam argument dotyczy wszystkich rozwiązań, low-tech lub hitech ... można argumentować, że hitech wymagający większej zależności między systemami faktycznie sprawia, że ​​sytuacja jest najgorsza, a nie łatwiejsza. To powiedziawszy, istnieje próg, w którym proste, mało zaawansowane technologicznie rozwiązanie staje się bardziej skomplikowane niż w pełni rozwinięty technologicznie odpowiednik.
Newtopian
1
Tak, i teraz rozwiązuję kilka takich przykładów w projekcie. Najważniejsze jest to, że musi istnieć ściślejszy interfejs niż system plików więcej niż nie. Niestety, w większości odziedziczonych przeze mnie niskonakładowych systemów nie zastosowano odpowiednich pomysłów ani projektów. Liczba wyjątków, na które mogę liczyć z jednej strony.
Berin Loritsch
0

Najpierw uzgodnijmy, co to jest plik . Plik to spakowane dane o nazwie, które można przesyłać, odbierać, tworzyć i usuwać za pomocą (bardzo zbliżonych) operacji atomowych.

Wiele systemów plików (Mac OS i nowsze systemy plików Linux) implementuje „widelce”, często używane do przechowywania zasobów i metadanych. Takie podejście do przechowywania metadanych było problematyczne, ponieważ tradycyjne metody przesyłania sieciowego, metody tworzenia kopii zapasowych i przywracania oraz metody kopiowania plików były niespójne, szczególnie gdy źródłowy i docelowy system plików różnie rozumiał rozwidlenia plików.

Nazwa pliku służy do przechowywania metadanych, ponieważ a) zawsze tam jest, b) metadane zawsze były obecne w nazwie pliku (przynajmniej przy użyciu rozszerzeń plików), c) nazwa pliku ulega bardzo niewielkiemu tłumaczeniu podczas przenoszenia pomiędzy systemami (rozróżnienie wielkości liter, ograniczenia zestawu znaków, ograniczenia znaków poza).

Nazwa pliku jest więc widoczna, przenośna i łatwa do zarządzania. Nie jest to zła rzecz do przechowywania niektórych metadanych.

Prawdopodobnie najlepszym rozwiązaniem dla ogólnych metadanych plików jest użycie repozytorium treści , w którym repozytorium treści można skonfigurować za pomocą schematu metadanych dla plików. W wielu przypadkach jest to przesada, ale IMHO jest drogą do poważnego zarządzania metadanymi.

BobDalgleish
źródło
0

Podejrzewam, że mogłeś zobaczyć gdzieś kod, który robi niechlujne lub kruche rzeczy z nazwami plików, ale to nie znaczy, że „przechowywanie metadanych w nazwach plików” jest ogólnie złe.

Nazwy plików to metadane - są to dane o danych w pliku, niezależnie od samych danych pliku. W rzeczywistości nazwy plików są tak stare, że prawdopodobnie są kanonicznym przykładem metadanych.

Jeśli weźmiesz pod uwagę, że rozszerzenia plików są tylko końcową częścią nazwy pliku, to koncepcja nazwy pliku jako metadanych staje się jeszcze bardziej nieunikniona.

użytkownik1172763
źródło