In un recente progetto mi è stato chiesto di implementare un sistema di eventi. Un Event
doveva avere un Location
che originariamente era stato escluso come semplice posizione fisica con alcune note extra opzionali. Poi le specifiche sono cambiate (come hanno l'abitudine di fare) e dovevamo anche avere eventi "online". Questi non avrebbero un indirizzo fisico ma avrebbero comunque bisogno di note su come partecipare (ad esempio l'URL, istruzioni per partecipare).
Abbiamo deciso di adattare la tabella delle posizioni esistente aggiungendo un campo IsOnline
e il risultato è stato il seguente:
+-----------------+ +---------------+
| Event | | Location |
+-----------------+ +---------------+
| Id | .--+ Id |
| Name | | | Name |
| Summary | | | Address |
| Date | | | Postcode |
| Capacity | | | IsOnline |
| LocationId +--' | Notes |
+-----------------+ +---------------+
Un esempio di una voce fisica e una voce online nella tabella Località sono simili a questa:
+----+----------------+--------------------------------------+----------+----------+---------------------------------------+
| Id | Name | Address | Postcode | IsOnline | Notes |
+----+----------------+--------------------------------------+----------+----------+---------------------------------------+
| 1 | Physical Event | 10 Downing Street, London | SW1A 2AA | 0 | Ask the policeman to let you in |
| 2 | Online Event | http://programmers.stackexchange.com | null | 1 | You will need a stackexchange account |
+----+----------------+--------------------------------------+----------+----------+---------------------------------------+
Funziona (attualmente) per il nostro caso di uso semplice ma è chiaramente un po 'un trucco e mi ha fatto pensare - quale sarebbe il modo corretto e normalizzato per modellare questo tipo di relazione (Dove un'entità deve avere un A o un B ma non entrambi)?