Database
 sql >> Baza danych >  >> RDS >> Database

Czy ewolucja danych kontaktowych oznacza zmianę bazy danych?

Obecnie istnieje wiele sposobów skontaktowania się z kimś, prawda?

Dysponujemy różnymi telefonami:komórkowymi i stacjonarnymi, osobistymi i służbowymi. Mamy różne adresy – mieszkalny, pocztowy, rozliczeniowy, służbowy itp. – i prawdopodobnie kilka adresów e-mail. Nie zapomnij o Skype i różnych aplikacjach do przesyłania wiadomości. Teraz dodaj LinkedIn i Facebooka – które, nawiasem mówiąc, mają swoje własne elementy wiadomości.

Nie tak dawno wiele z nich nie istniało. Możesz więc prawie zagwarantować, że za kilka lat będziemy mieli nowy sposób kontaktowania się z ludźmi i organizacjami.

Czy możemy zamodelować wszystkie te dane kontaktowe w taki sposób, abyśmy nie musieli zmieniać projektu naszej bazy danych, gdy pojawi się „najnowsza rzecz”? Czytaj dalej, aby dowiedzieć się…

Model punktu kontaktowego partii

Jednym słowem tak. Bazy danych można zaprojektować tak, aby pomieścić informacje, których nawet jeszcze nie mamy.

Wskoczę od razu i pokażę rozwiązanie, a następnie opiszę, jak te elementy współpracują ze sobą. Zadzwonię do różnych sposobów kontaktowania się ze stronami punktami kontaktowymi , chociaż widziałem metody kontaktu a nawet lokalizacje kontaktów używany.

Fizycznie wszystkie te punkty kontaktowe będą przechowywane w jednej kolumnie tabeli, contact_point.contact_value . Pomyśl o numerze telefonu, adresie e-mail lub adresie internetowym (URL), a zrozumiesz, dlaczego możemy je wszystkie tutaj przechowywać; na tym poziomie są tylko stringami (varcharami). Rozróżnienie tkwi w metadanych. Jedynym wyjątkiem jest adres pocztowy, który zostanie opisany bardziej szczegółowo później.




Żółte tabele po lewej stronie zawierają metadane, a niebieskie tabele po prawej zawierają dane biznesowe.

Główne kategorie

Chociaż mamy wiele sposobów skontaktowania się z kimś, te sposoby faktycznie dzielą się na niewielką liczbę kategorii lub typów. Zobaczysz, co mam na myśli, gdy spojrzysz na poniższą listę:


Typ punktu kontaktowego
Numer telefonu (stacjonarny)
Numer komórkowy
Numer faksu
Adres e-mail
Adres pocztowy
Adres internetowy
Pager


W pewnym sensie są one fizycznie odrębne. Oczywiście możesz użyć telefonu komórkowego, aby zadzwonić na numer stacjonarny lub inny telefon komórkowy. Jeśli chodzi o połączenia głosowe między telefonami stacjonarnymi i komórkowymi, rozróżnienie nie jest tak ważne. Mimo to bardziej prawdopodobne jest, że wyślemy SMS-a na telefon komórkowy niż na stacjonarny.

Ale prawdopodobnie nie będziesz celowo dzwonić pod numer faksu. W końcu, co mu powiesz, gdy go usłyszysz, oprócz „Ups, zły numer”? Oczywiście dużo bardziej prawdopodobne jest, że zadzwonisz za pomocą innego faksu, niezależnie od tego, czy jest to urządzenie fizyczne, czy emulowane. Nie wyślesz też listu na telefon stacjonarny ani nie spróbujesz nawiązać połączenia głosowego na adres pocztowy.

Ważne jest, abyśmy rozróżniali te typy, ponieważ inaczej się z nimi obcujemy. Będzie to szczególnie ważne, jeśli Twoja aplikacja jest w jakikolwiek sposób zintegrowana z usługami komunikacyjnymi. Musi wiedzieć, z jakim typem wchodzić w interakcje.

Jak strony wykorzystują punkty kontaktowe

Jest to prawdopodobnie nieco bardziej intuicyjne, bardziej zgodne z tym, jak myślimy o typach kontaktów. Oto dłuższa lista (ale nie wyczerpująca!), która pomoże Ci wyczuć te typy:


Typ osoby kontaktowej (typ punktu kontaktowego)
Linia konferencyjna (numer telefonu)
Adres rozliczeniowy (adres pocztowy)
Adres dostawy (adres pocztowy)
Linia bezpośrednia (numer telefonu)
Adres wakacyjny/urlop (adres pocztowy)
Telefon wakacyjny/urlopowy (numer telefonu)
Adres domowy (adres pocztowy)
Telefon domowy (numer telefonu)
Telefon domowy/faks (numer telefonu)
Profil LinkedIn (adres internetowy)
Adres główny (adres pocztowy)
Główny adres e-mail (adres e-mail)
Główny faks (numer faksu)
Telefon główny (numer telefonu)
Główna strona internetowa (adres internetowy)
Osobisty adres e-mail (adres e-mail)
Osobisty faks (numer faksu)
Osobisty telefon komórkowy (numer telefonu komórkowego)
Osobisty pager (Pager)
Osobista witryna (adres internetowy)
Adres dodatkowy (adres pocztowy)
Telefon dodatkowy (numer telefonu)
Profil mediów społecznościowych (adres internetowy)
Adres pracy (adres pocztowy)
Służbowy adres e-mail (adres e-mail)
Faks służbowy (numer faksu)
Komórka służbowa (numer telefonu komórkowego)
Telefon służbowy (numer telefonu)


Adres pocztowy – szczególny przypadek

Wszystkie te typy punktów kontaktowych są przechowywane w jednym polu, z wyjątkiem adresu pocztowego. Zwykle wymaga to kilku linii (lub pól).

Jest tutaj artykuł na blogu, który proponuje prosty, niezależny od języka sposób przechowywania adresów pocztowych. Jeśli Twoje wymagania są raczej podstawowe – np. do drukowania etykiet adresowych w miarę ich wprowadzania do systemu – to podejście prawdopodobnie wystarczy. Jeśli Twoje potrzeby są bardziej wyrafinowane, prawdopodobnie będziesz musiał opracować inne rozwiązanie.

Aby zorientować się, jak złożone może być adresowanie, rzuć okiem na ten schemat dla typów adresów British Standard BS7666. Norma składa się z szeregu części obejmujących Gazeterów Ulic, Gazeterów Gruntów i Nieruchomości oraz punkty dostaw. Nie rozróżnia nieruchomości komercyjnych i mieszkaniowych; pomiędzy gruntami zajętymi, zabudowanymi lub niezabudowanymi; między obszarami miejskimi lub wiejskimi; lub między podmiotami, które można adresować pocztowo, a podmiotami, które nie mają adresu pocztowego takich jak maszty komunikacyjne (wieże). Aby to osiągnąć, wprowadza terminy, których większość z nas prawdopodobnie nie zna, takie jak podstawowy obiekt adresowalny (PAO), czyli nazwa nadana obiektowi adresowalnemu, który można zaadresować bez odniesienia do innego obiektu adresowalnego. Znane przykłady PAO obejmują nazwę budynku lub numer ulicy. Wtórny obiekt adresowalny (SAO) jest nadawany dowolnemu obiektowi adresowalnemu, który jest adresowany przez odniesienie do PAO. Może to być pierwsze piętro nazwanego budynku.

Aby dać nam wizualizację tego, szybko przekształciłem to w narzędzie do modelowania UML. Oto, co otrzymujemy:

Chodzi mi o to, że może się to stać dość skomplikowane i niechlujne; adresowanie w niektórych domenach może być rzeczywiście bardzo złożone.

Gdybyś miał spłaszczyć to do pojedynczej tabeli relacyjnej, otrzymasz coś takiego:




Chociaż przechwytuje to składniki adresu BS7666, nie mówi, jak działa model. Cała logika relacyjna schematu XML zostaje ukryta w logice aplikacji.

Te dwa diagramy przedstawiają dwie ekstrema modelowania danych . Ale czy istnieje pośredni sposób modelowania adresów?

Rzeczywiście możliwe jest posiadanie stosunkowo prostego modelu adresu, który jest elastyczny i konfigurowalny.

Składniki adresu

Składnik adresu to zazwyczaj wiersz na etykiecie adresowej, a raczej rodzaj wiersza na etykiecie adresowej. Rodzaje komponentów, których zwykle używamy dla adresów w Wielkiej Brytanii, wymieniono w poniższej tabeli:


Typ składnika adresu
Adresat
Obszar
Nazwa budynku
Numer budynku
Kraj
Powiat
Nazwa działu
Lokalizacja zależna
Nazwa zależnej drogi przelotowej
Podwójnie zależna lokalizacja
Międzynarodowy kod pocztowy
Poziom
Miejscowość
SSC sortowania poczty
Nazwa organizacji
Numer końcowy PAO
Końcowy przyrostek PAO
Numer początkowy PAO
Sufiks początkowy PAO
Tekst PAO
Skrytka pocztowa
Kod pocztowy
Poczta
Kod pocztowy
Typ kodu pocztowego
Numer końcowy SAO
Sufiks końcowy SAO
Numer początkowy SAO
Sufiks początkowy SAO
Tekst SAO
Ulica
Opis ulicy
Nazwa podbudynku
Nazwa przelotu
Miasto


Możesz mieć trzy lub cztery wiersze adresu, a także miasto pocztowe i kod pocztowy. Jednak trudność, jaką napotkasz, polega na określeniu, co faktycznie zawierają te wiersze kiedy ma to znaczenie – np. podczas mapowania danych między systemami. Kiedy przeprowadzasz profilowanie danych, zauważysz, że wiersz adresu 3 czasami zawiera zależną miejscowość, ale innym razem zawiera hrabstwo lub miejscowość. Teraz zajmujesz się przetwarzaniem języka naturalnego (NLP); musisz rozpoznać różnicę między miejscowością a powiatem. A permutacje mnożą się w miarę dodawania kolejnych krajów.

Dlatego musimy zdefiniować wszystkie składniki adresu dla wszystkich krajów, w których działamy.

Formaty adresu

Formaty adresów składają się z dwóch części:nagłówka i jego szczegółów. Nagłówek to w zasadzie nazwa lub tytuł formatu adresu jest znany przez. Przykłady mogą obejmować:


Typ formatu adresu
Ogólny 3-wierszowy
Ogólny 5-wierszowy
Poczta Sił Brytyjskich (BFPO)
Międzynarodowe
Adres poczty (PAF)
Stany Zjednoczone Adres
Adres francuski


Biorąc jako przykład brytyjski pełny format adresu pocztowego (PAF), definiujemy następujące elementy formatu adresu:


Format Komponent Sekwencja Czy jest obowiązkowe?
PAF Adresat 1 N
PAF Nazwa organizacji 2 N
PAF Nazwa działu 3 N
PAF Skrytka pocztowa 4 N
PAF Nazwa budynku 5 N
PAF Nazwa podbudynku 6 N
PAF Numer budynku 7 N
PAF Dojazd 8 N
PAF Ulica 9 N
PAF Podwójnie zależna lokalizacja 10 N
PAF Lokalizacja zależna 11 N
PAF Poczta 12 T
PAF Kod pocztowy 13 T


Nasza aplikacja odczytuje te metadane i wyświetla składniki adresu we właściwej kolejności. Gdy wymagane jest przechwytywanie adresu, metadane informują nas, czy składnik adresu jest obowiązkowy, czy nie.

Coraz częściej nasza aplikacja żąda kodu pocztowego od użytkownika końcowego i wyszukuje odpowiednie wartości oraz automatycznie wypełnia składniki adresu. Niektóre aplikacje pozwalają użytkownikowi na edycję adresu; inne [irytujące] nie!

Nie jest to pokazane w PDM, ale jeśli Twoja organizacja działa na arenie międzynarodowej, możesz zdefiniować relację wiele-do-wielu między address_format_type i country aby właściwy format adresu (na podstawie kraju użytkownika) był prezentowany użytkownikowi końcowemu (party ).

Kiedy i tylko wtedy, gdy contact_point to adres pocztowy contact_point_type , musi mieć związek z typem_formatu_adresu. Z drugiej strony wynika z tego, że inne typy adresów nigdy mieć związek z address_format_type . Ponadto format musi pozostać stały na całe życie contact_point , w przeciwnym razie wprowadzisz możliwość problemów z integralnością danych. (Aby tak nie było , docelowy address_format_components musi być podzbiorem źródła address_format_components ).

Kolumna contact_value nie ma znaczenia dla adresu pocztowego, ponieważ wartości są przechowywane w ddress_line.line_content . I odwrotnie, contact_value jest obowiązkowe dla wszystkich innych contact_point_types . Zasadniczo contact_point.contact_value i address_line.line_content wzajemnie się wykluczają.

Relacja wiele-do-wielu między partią a punktem kontaktowym

Możesz pomyśleć o contact_point (plus address_line ) jako zawierające wartości i party_contact jako określenie użycia. Umożliwia to pojedynczy contact_point mieć wiele zastosowań . Nasz domowy adres [pocztowy] może być również naszym adresem rozliczeniowym i adresem dostawy, w zależności od kontekstu.

Jak dotąd narracja zakładała, że ​​strona posiada określony contact_point . Ale model danych nie narzuca tej zasady własności! Nie wprowadza żadnych takich ograniczeń. W przypadku tego projektu istnieje inna możliwość:wiele stron dla tych samych punktów kontaktowych.

Musisz dokładnie rozważyć implikacje, zanim wyruszysz tą drogą.

Oto przykład. W Wielkiej Brytanii organizacje przyznające (AOs) zazwyczaj zatrudniają nauczycieli jako egzaminatorów. Nauczyciel ma dwie relacje:jedną ze szkołą, w której pracuje, a drugą z AO jako egzaminatorem. Szkoła będzie miała bank contact_points z różnymi numerami telefonów i ewentualnie jednym lub kilkoma adresami pocztowymi. Będą to takie rzeczy jak główny adres szkoły (adres pocztowy), główny e-mail (adres e-mail), główny faks (numer faksu) i główny telefon (numer telefonu).

Jest całkiem możliwe, że nasz egzaminator może używać tych samych contact_points jako swoją szkołę, ale użyje party_contact zdefiniować je jako związane z pracą. Jeśli zmieni się główny numer telefonu szkoły, numer służbowy nauczyciela zostanie automatycznie zaktualizowany, co jest całkiem miłe.

Jeśli pójdziesz tą drogą, musisz zdefiniować na poziomie aplikacji która strona lub strony mogą aktualizować contact_points .

Szybkie słowo o wydajności

Żółte tabele metadanych będą stale używane przez zapytania. W konsekwencji prawdopodobnie pozostaną w pamięci. W większości systemów RDBMS można przypiąć tabele do pamięci, aby to zapewnić. W Oracle utworzyłbym je jako tabele zorganizowane według indeksu, które są małe i dobrze działają. Zrób to, co jest odpowiednikiem dla twojego RDBMS.

Chcesz również upewnić się, że party_contact wiersze są umieszczone w tym samym bloku (lub stronie) przy użyciu indeksu klastrowego na party_id . Zrób to samo z address_line.contact_point_id . Zmniejsza to ilość IO.

Istnieje inna opcja, jeśli chcesz party wyłączne posiadanie contact_point . Następnie możesz scalić contact_point w party_contact aby utworzyć party_contact_point (nadal zgrupowane na party_id ). Upraszcza to model i może poprawić wydajność.

Zmiana kontaktów nie oznacza zmiany baz danych

Żyjemy w czasach, kiedy można powiedzieć, że zmiana jest jedyną stałą.

Nie oznacza to, że za każdym razem, gdy coś się zmieni, musi to wpłynąć na Twoją bazę danych. Przy odrobinie namysłu możemy zabezpieczyć nasze projekty na przyszłość – być może więcej niż dotychczas. Takie postępowanie pomaga nam szybko reagować na nieuniknioną zmianę.

Jeśli rozpoczynasz projekt od podstaw, sugerowałbym wykorzystanie Modelu Partii (którego częścią jest Contact Point) dla organizacji i osób. Dlaczego nie otworzyć modelu i dostosować go do swoich potrzeb? Zachęcamy do pobrania kopii i zrobienia jej własnej.

Ale jeśli twoja baza danych lub bazy danych są już określone, schemat, który tutaj przedstawiłem, nadal może być używany, w formie XML, do definiowania ładunku podczas integracji danych między systemami.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Używanie wzorców przepływu pracy do zarządzania stanem dowolnej jednostki

  2. Rozpoznawanie wzorców wierszy w SQL

  3. Wielkość próbki i czas trwania AKTUALIZACJI STATYSTYK:czy to ma znaczenie?

  4. Schemat gwiazdy kontra schemat płatka śniegu

  5. Jak wykonać surowy SQL w SQLAlchemy