Progettazione del database, come gestire i freelance

4

Il contesto

Sto modellando un database per un piccolo sistema ERP. Tuttavia ho recentemente colpito un punto difficile che sto attraversando un periodo difficile. La logica di questo comporta alcuni casi speciali, spero che qualcuno con un background di progettazione DB possa aiutare (questo è il mio primo progetto di modello DB di grandi dimensioni).

  1. Contatti è una tabella contenente informazioni su varie persone.
  2. Un contatto ha un campo organization_id che è una chiave esterna di Organization, id
  3. Gestiamo un caso in cui un contatto non ha un'organizzazione (organization_id = null) è un "freelance" ...
  4. Organizzazione è una tabella contenente informazioni sulle organizzazioni. Un'organizzazione è collegata a molti contatti.
  5. Fattura è una tabella contenente informazioni sulla fattura.

Il problema: Supponiamo che un contatto A abbia una fattura X e che il contatto cambi l'organizzazione (dopo la transazione). Chi possiede la fattura? (in altre parole, come collego le fatture a determinate entità).

Possibili soluzioni che ho esplorato

  1. Collega Fattura a Organizzazione con una chiave esterna (organization_id) nella tabella Fattura.

Tuttavia, questo non gestisce il caso in cui un contatto non ha un'organizzazione (è un libero professionista). Se tale contatto ha una vendita / fattura ... il sistema non può gestirlo .

  1. Collega Fattura a Contatti con una chiave esterna (contact_id) nella tabella Fattura.

Tuttavia, se un contatto cambia organizzazione, quell'organizzazione erediterà le fatture passate del contatto (che è ERRONE).

  1. Sul front-end, genera automaticamente un'organizzazione in base alle informazioni di un contatto quando quel contatto è un "freelancer".

Per essere onesti, non mi piace questa soluzione. Sembra un trucco modesto.

  1. Forza i contatti per avere un'organizzazione ...

Spero ci sia un'altra soluzione oltre a questa ...

EDIT # 1

Dopo aver analizzato alcune risposte, ho capito che manca un'importante informazione. Il piccolo sistema ERP sarà utilizzato da molti clienti, alcuni dei quali seguono il modello B2B (Business-to-Business) e altri che seguono il B2C (Business-to-Customer) modello. Nel modello B2C, i Contatti NON hanno un'organizzazione. Ma dovrebbero comunque essere in grado di avere progetti / vendite ad essi associati.

    
posta Sebastien Daniel 20.09.2014 - 01:46
fonte

3 risposte

10

Non c'è niente di sbagliato nel fornire un'organizzazione individuale per ciascun libero professionista, anche quando c'è un solo "dipendente" in questa organizzazione. In realtà, questo riflette la situazione legale molto meglio, dal momento che un libero professionista può avere il ruolo di una società (proprio indirizzo / account di posta / numero di telefono) e il ruolo completamente separato di una persona privata o persona impiegata pure. E ti aiuterà a modellare anche altre cose più uniformi.

Il CRM che stiamo utilizzando nella nostra azienda funziona esattamente come questo

  • per prima cosa crei una nuova organizzazione / azienda nel sistema, con indirizzo, indirizzo di posta centrale, sito web, telefono ecc.

  • le persone di contatto vengono sempre aggiunte all'organizzazione "attiva". È possibile inserire un indirizzo diverso dall'indirizzo dell'azienda, se lo si desidera (ma non è necessario). E non puoi aggiungere contatti senza un'organizzazione.

  • le persone di contatto non cambiano la loro azienda; possono diventare inattivi, e puoi aggiungere una nuova persona di contatto che sia una copia di una esistente. Questo aiuta a gestire le informazioni storiche che in passato erano i miei interlocutori (anche quando si trovano in una nuova azienda oggi) ed evita problemi come i tuoi.

L'ultimo punto non è sicuramente la soluzione migliore per ogni sistema. Devi decidere di questo tipo di modello adatto alle tue esigenze nel tuo caso specifico.

Per la tua modifica: nel caso in cui desideri veramente che le organizzazioni e le singole persone siano responsabili, potrebbe essere meglio seguire le idee di Fowler dal suo libro "Modelli di analisi" su come modellare la responsabilità (vedi pagina 4) . Crea un "party" di tavolo aggiuntivo per persone e organizzazioni. Ogni entità in "partito" ha una voce corrispondente in "organizzazione" o una in "persona". Quando si esegue la modellazione relazionale agli oggetti, la "festa" sarebbe solo la classe base della persona e dell'organizzazione. La fattura ottiene solo un "ID partito" come chiave esterna di riferimento.

Ciò consentirà di trattare le singole persone e le organizzazioni in modo uniforme.

    
risposta data 20.09.2014 - 12:32
fonte
3

A prima vista, direi che due cose renderebbero le cose più semplici:

Crea un'organizzazione che rappresenti "Freelance" e assegna tutti i contatti freelance a tale organizzazione.

e

Una fattura deve contenere sia un ID dell'organizzazione che un ContactId, che rappresenta la relazione Organizzazione e Contatto al momento della fattura.

Se il contatto cambia le organizzazioni in un secondo momento, non importa, perché la fattura ha ancora l'ID organizzazione originale.

    
risposta data 20.09.2014 - 02:15
fonte
0

Un avvertimento da parte di un designer esperto che ama i database: cercare di indovinare le relazioni dati senza disporre di un set approvato di casi di utilizzo aziendali, diagrammi di relazioni tra entità, un diagramma di flusso dati principale all'interno dell'azienda, ecc. è pericoloso. La tua domanda sembra mostrare che stai cercando di catturare i difetti di relazione "al volo" dal punto di vista del database, invece di pianificare la struttura dai diagrammi di dati approvati e quindi di costruire i ponti che potresti dover incuneare nel vecchio sistema il nuovo. Ciò può portare a problemi di contabilità ... non solo incubi di dati come quelli che hai già ipotizzato. ( un esempio di caso )

Una tendenza interessante che ho visto con alcuni sistemi è quella di far rintracciare le persone come oggetti dati, che possono essere convalidati come oggetti del mondo reale da informazioni di identificazione personale. Le persone possono avere un portafoglio che include ruoli e storie, consentendo loro di essere referenziati mentre si spostano attraverso le organizzazioni o tag che consentono loro di fare riferimento a vari servizi di dati o data warehouse. Fai attenzione ai dubbi sulla privacy ...

Il cliente come ruolo che può alternare l'utilizzo dei dati dagli oggetti Organizzazione o Person, con un indicatore a bandiera, può consentire di gestire il problema di integrazione di b2c b2b senza richiedere troppe modifiche di transizione. In generale, le transazioni memorizzano i dettagli come la chiave esterna di un oggetto nella posizione di un ruolo e di un timestamp. Ad esempio un oggetto chiamato Location, connesso a GIS, potrebbe avere un ruolo come ship-from, ship-to, bill-to, bill-from o mail-to.

Le tabelle per i sistemi critici dovrebbero avere: ID univoco, flag attivo / inattivo, data-ora attiva, data e ora dell'ultima modifica, data-ora non attiva, codice di stato - Questi permetteranno il miglior controllo su query di dati e transazioni storici registri di controllo. Il codice di stato ti consente di tenere traccia di cose come la fusione di record, l'inserimento di errori, le bandiere legali, ecc., Nonché la riduzione della duplicazione dei dati nelle transazioni

I sistemi ERP più recenti gestiranno database strutturati e dati non strutturati, SQL e NoSQL, ecc. Oggetti, ruoli e transazioni come mentalità utilizzati nella pianificazione possono ridurre al minimo il tuo mal di testa in futuro.

    
risposta data 21.09.2014 - 07:18
fonte

Leggi altre domande sui tag