2010-03-16 9 views
5

Mam bazę danych, która przechowuje (między innymi), następujące fragmenty informacji:Czy istnieje sposób na dokonywanie efektów typów danych zdefiniowanych przez użytkownika w MySQL?

  • identyfikatory sprzętowe BIGINT s
  • magazynowe Zbiorniki BIGINT s
  • nazwy sprzętu VARCHAR s
  • World Wide Port Nazwy VARCHAR s

Chciałbym być w stanie uchwycić bardziej wyrafinowane d definicja tych typów danych. Na przykład identyfikatory sprzętu nie mają znaczenia liczbowego, więc nie obchodzi mnie, jak są sformatowane podczas wyświetlania. Możliwości przechowywania są jednak liczbami kardynalnymi i na życzenie użytkownika chciałbym przedstawić je w tysiącach i separatorach dziesiętnych, np. 123 456,789. Dlatego chciałbym zawęzić BIGINT do, powiedzmy ID_NUMBER i CARDINAL.

To samo dotyczy nazw sprzętowych, które są tekstem prostym i WWPN, które są ciągami znaków, np. 24: 68: AC: E0. Dlatego chciałbym zawęzić VARCHAR do ENGLISH_WORD i HEXSTRING.

Określone typy danych, które przygotowałem, służą wyłącznie do celów ilustracyjnych.

Chciałbym zachować wszystkie te informacje w jednym miejscu i zastanawiam się, czy ktoś wie o dobrym sposobie przechowywania tego wszystkiego w moich definicjach tabel MySQL. I może użyć pola Komentarz definicji tabeli, ale to mi śmierdzi.

Jednym z podejść byłoby zdefiniowanie struktury danych w innym miejscu i użycie tej definicji do wygenerowania moich CREATE TABLE s, ale byłby to duży przeróbka kodu, który obecnie mam, więc szukam alternatyw.

Wszelkie sugestie? Używany język aplikacji to Perl, jeśli to pomaga.

+0

Przejdź na postgres? :) – hobbs

Odpowiedz

6

Dobrym sposobem na zrobienie tego jest użycie widoków. Na przykład, aby wstawić do liczby kardynalnej przecinki, można użyć:

mysql> create table foo (id int); 
Query OK, 0 rows affected (0.12 sec) 

mysql> insert into foo (id) values (123456789); 
Query OK, 1 row affected (0.00 sec) 

mysql> create view v_foo as select format(id, 0) as id from foo; 
Query OK, 0 rows affected (0.10 sec) 

mysql> select * from v_foo; 
+---------------+ 
| id   | 
+---------------+ 
| 123,456,789 | 
+---------------+ 
1 row in set (0.02 sec) 

można korzystać z innych string functions formatowanie innych dziedzinach, oraz przechowywanie ich w definicji widoku.

1

Zaproponuję odpowiedź, która zadaje pytanie.

Jednym z mantrami, że ludzie, którzy modelu baz danych jak do szumu jest oddzielenie warstwy prezentacji (formatowania) i danych i wierzę, że odpowiednia część z like idzie coś takiego:

„Ty nie przechowuje sformatowane dane w bazach danych, ani nie dyskryminuj żadnego wyboru formatowania. Będziesz przechowywać dane w natywnych obsługiwanych typach danych. Aplikacje powinny dostarczać warstwę prezentacji i formatować kolumny. "

Cóż, odpowiedź Friedo nie idzie bezpośrednio przeciwko temu - dane są prezentowane tylko poprzez widok, magazyn jest nadal natywny.

To zależy od tego, jak zdefiniujesz tam warstwę prezentacji - jeśli widok i ustawienia serwera są uważane za część warstwy prezentacji, wszystko jest w porządku, w przeciwnym razie wystąpią potencjalne problemy, ponieważ ja, potencjalny użytkownik twojego systemu, nie będę umieć określić, że mój tysiąc separatora jest pojedynczym cytatem (i to przynajmniej w miejscu mojego obecnego zamieszkania).

Co więcej, kiedy jedziesz tą drogą, jak długo potrwa, dopóki nie będziesz musiał rozprawiać się z prośbami o ponowne przeanalizowanie danych z powrotem na tekst i ewentualnie skończyć się sytuacjami, w których może to nastąpić? niejednoznaczne (takie jak DD/MM/RR wobec MM/DD/RR)?

Powyższy zapis dotyczy tylko formatowania, określenie liczby cyfr dziesiętnych określa domenę danych i jest dobrą rzeczą, ponieważ ogranicza możliwość niespójnych danych wprowadzanych do bazy danych.

EDYCJA: (nieco bardziej rozrywkowy dla purystów, w odniesieniu do baz liczbowych) Mówienie, że dane liczb szesnastkowych nie mają znaczenia w innych bazach, jest generalnie błędną instrukcją. Wartości liczbowe nie mają podstawy i mogą być reprezentowane w dowolnej bazie. Ich domena (zestaw dozwolonych wartości) jest taka sama.

Wybór adresu szesnastkowego dla adresu MAC jest naturalny ze względów historycznych oraz z faktu, że na przykład łatwo jest odczytać część dostawcy w tym formacie. Wybór "zabawnego" formatu dla adresów IPv4 jest historycznym z zapewne anegdotycznym powodem.

Ale oba są tylko wyborem i wewnętrznie dobry system będzie je przechowywać bez uprzedzeń (na przykład przechowywanie IPv4, ponieważ tekst nie jest dobrą rzeczą). Kiedy RDBMS przedstawia wyniki zapytania (na ekranie), już przyjmuje rolę aplikacji i formatuje wyniki w pewien sposób.

Nie ma to znaczenia, a format używany w aplikacji nie powinien wpływać na sposób przechowywania pojemności pamięci masowej lub innych właściwości obiektu.

Tak więc mówię, że to dane konfiguracyjne aplikacji (metadane do daty głównej) i oczywiście może/powinien być przechowywany w bazie danych, ale z MySQL (który nie jest tak bogaty w definiowanie typów niestandardowych) może pasuje do definicji tabeli i powinna być po prostu zapisana w innej tabeli, którą aplikacja będzie czytać i stosować do twoich kolumn podczas prezentacji danych użytkownikowi, a nie w jakiś hackowy sposób, który nie będzie przenośny.

Na przykład pomysł na widok działa, ale czy można łatwo zapytać widok, aby uzyskać formaty zastosowane do pól? Lub powiedzmy, że chcesz zmienić formatowanie we wszystkich wystąpieniach pola WWPN we wszystkich kwerendach, które go używają (szesnastkowanie również brzmi jak już nie tak), byłoby to łatwe? Lub jeśli istnieją inne zapytania, które przekształcają dane i zapisują je w innej tabeli, czy zapiszesz je z zastosowanym formatem lub bez niego (ponowne przetwarzanie)? Etc ...

Teraz jeśli miał tabelę, która przechowuje dane konfiguracyjne aplikacji takich jak FieldFormatting: stołowy, pole, format, CheckRules, LongFormat (lub cokolwiek sprawia największy sens w danej sytuacji) to powyższe pytania stają się nieco łatwiej radzić sobie z tym i wybierać dodatkowe opcje dla aplikacji i logiki biznesowej.

Jeśli naprawdę (naprawdę, naprawdę) musisz zapewnić bezpośredni dostęp do bazy danych, a typy natywne sprawią, że dane staną się nieczytelne dla użytkowników i po prostu musisz sformatować, a następnie możesz użyć powyższej tabeli do wygenerowania i zaktualizowania widoków/zapytania pół-automatycznie.

UWAGA: Przyjmuję tutaj purystyczny punkt widzenia, ponieważ mam wrażenie, że podejmujesz tutaj decyzje projektowe, a nie gonisz za ostatnią kroplą wydajności lub wygody (na przykład między typami danych aplikacji i typami danych baz danych), gdy jest to praktyczne. problemy mogą być ważniejsze niż modelowanie wytycznych i zasad. Ale pytania z ostatniego akapitu wciąż są aktualne.

+0

Może źle rozumiem, co tu mówisz, ale czytam to tak, jakbyśmy się zgadzali. Problem polega na tym, że typy danych udostępniane przez MySQL są zbyt szerokie. Mam na przykład element "aliasingu" z typem "VARCHAR". Potrzebuję reprezentować tekst i muszę reprezentować liczby szesnastkowe. Numery szesnastkowe nie mają znaczenia w żadnej innej bazie liczbowej (są one zbliżone do adresów MAC sieci). To, co * próbuję * zrobić, to oddzielić prezentację danych od bazy danych, ale dostarczyć wystarczającej ilości informacji w bazie danych, aby umożliwić właściwy wybór formatu. – Dancrumb

+0

Jesteśmy po tym samym celu, w który wierzę. Miejcie na uwadze, mimo że dążę do jednego punktu widzenia, że ​​myślę, że odpowiedź Friedo jest dobra na poziomie, na którym została podana - proste rozwiązanie dla prostego scenariusza, a ze świadomością jej ograniczeń nie zrobi tego jakakolwiek krzywda. Próbowałem tylko zapewnić większy obraz, który może, ale nie musi, obowiązywać w konkretnym przypadku. – Unreason

+0

@goran; dziękuję za odpowiedź i odpowiedź na nie. Myślę, że to interesujące pytanie ... szkoda, że ​​nie było większej odpowiedzi ze strony społeczności SO. Mimo to, naprawdę doceniam twój wkład tutaj. – Dancrumb

Powiązane problemy