Progettazione del database per la prima volta: sto progettando troppo? [chiuso]


246

sfondo

Sono uno studente CS del primo anno e lavoro part-time per la piccola impresa di mio padre. Non ho alcuna esperienza nello sviluppo di applicazioni nel mondo reale. Ho scritto degli script in Python, alcuni corsi in C, ma niente del genere.

Mio padre ha una piccola attività di formazione e attualmente tutte le lezioni sono programmate, registrate e seguite tramite un'applicazione web esterna. Esiste una funzione di esportazione / "report" ma è molto generica e abbiamo bisogno di report specifici. Non abbiamo accesso al database effettivo per eseguire le query. Mi è stato chiesto di impostare un sistema di segnalazione personalizzato.

La mia idea è quella di creare le esportazioni CSV generiche e importarle (probabilmente con Python) in un database MySQL ospitato in ufficio ogni notte, da dove posso eseguire le query specifiche necessarie. Non ho esperienza nei database ma capisco le basi. Ho letto un po 'sulla creazione di database e forme normali.

Potremmo iniziare presto ad avere clienti internazionali, quindi voglio che il database non esploda se / quando ciò accade. Al momento abbiamo anche un paio di grandi aziende come clienti, con diverse divisioni (ad es. Società madre ACME, divisione sanitaria ACME, divisione ACME bodycare)

Lo schema che ho escogitato è il seguente:

  1. Dal punto di vista del cliente:
    • I clienti è il tavolo principale
    • I clienti sono collegati al dipartimento per cui lavorano
      • I dipartimenti possono essere sparsi in un paese: risorse umane a Londra, marketing in Swansea, ecc.
      • I dipartimenti sono collegati alla divisione di una società
    • Le divisioni sono collegate alla società madre
  2. Dal punto di vista delle lezioni:
    • Sessioni è la tabella principale
      • Un insegnante è collegato ad ogni sessione
      • Uno statusid viene assegnato a ciascuna sessione. Ad esempio 0 - Completato, 1 - Annullato
      • Le sessioni sono raggruppate in "pacchetti" di dimensioni arbitrarie
    • Ogni pacchetto è assegnato a un client

Ho "disegnato" (più come scarabocchiato) lo schema su un pezzo di carta, cercando di mantenerlo normalizzato nella terza forma. L'ho quindi inserito in MySQL Workbench e mi ha reso tutto molto carino:
( Fai clic qui per un elemento grafico a dimensioni intere )

testo alternativo
(fonte: maian.org )

Query di esempio che eseguirò

  • Quali clienti con credito ancora lasciato sono inattivi (quelli senza una classe programmata in futuro)
  • Qual è il tasso di frequenza per cliente / dipartimento / divisione (misurato dall'ID di stato in ogni sessione)
  • Quante lezioni ha avuto un insegnante in un mese
  • Contrassegna i clienti con un basso tasso di frequenza
  • Rapporti personalizzati per i dipartimenti risorse umane con i tassi di frequenza delle persone nella loro divisione

Domande)

  • È troppo ingegnoso o sto andando nella direzione giusta?
  • La necessità di unire più tabelle per la maggior parte delle query determinerà un grande successo in termini di prestazioni?
  • Ho aggiunto una colonna "lastession" ai clienti, poiché probabilmente sarà una query comune. È una buona idea o devo mantenere il database strettamente normalizzato?

Grazie per il tuo tempo


131
Caro studente CS del primo anno: continua a utilizzare StackOverflow. La tua domanda è interessante, ben scritta e utile. In altre parole, sei tra i primi 1% delle domande.
Adam Crossland,

Una divisione può contenere altre divisioni? In tal caso, una tabella "has" potrebbe essere utilizzata per collegare la divisione alla divisione in cui è contenuta.
Mark Schultheiss,

Grazie per i gentili commenti :) Mark Dovrò rivedere la documentazione per questo progetto, ma non credo che abbiamo identificato quel caso. Grazie per segnalarlo.
bob esponja,

1
Non mi piacciono le tue convinzioni di denominazione della chiave primaria. la tabella divisionsha una colonna denominata divisionid. Non lo trovi ridondante? Basta nominarlo id. anche i nomi delle tue tabelle, tra cui _has_: lo rimuoverei e lo nominerei per esempio cities_departments. le DATETIMEcolonne devono essere di tipo a TIMESTAMPmeno che non siano valori di input dell'utente. Penso che sia una buona idea avere i tavoli citiese countries. potresti riscontrare problemi nel limitare le tabelle a un singolo status. prendi in considerazione l'uso di an INTed esegui confronti bit a bit su di esso in modo da poter avere più significato lì
james

@binnyb Ci sono molte discussioni sull'uso di id come nome della chiave primaria che le persone dovrebbero considerare prima di decidere.
Jedi,

Risposte:


42

Qualche altra risposta alle tue domande:

1) Sei praticamente sul bersaglio per qualcuno che sta affrontando un problema come questo per la prima volta. Penso che i suggerimenti degli altri su questa domanda finora la coprano praticamente. Buon lavoro!

2 e 3) Il successo che subirai dipenderà in gran parte dall'avere e dall'ottimizzazione degli indici giusti per le tue particolari richieste / procedure e, soprattutto, il volume dei record. A meno che tu non stia parlando di oltre un milione di record nelle tue tabelle principali, sembra che tu sia sulla buona strada per avere un design sufficientemente mainstream che le prestazioni non saranno un problema su hardware ragionevole.

Detto questo, e questo si riferisce alla tua domanda 3, con l'inizio che hai probabilmente non dovresti davvero preoccuparti eccessivamente delle prestazioni o dell'ipersensibilità all'ortodossia di normalizzazione qui. Questo è un server di report che stai creando, non un back-end basato su transazioni, che avrebbe un profilo molto diverso rispetto all'importanza delle prestazioni o della normalizzazione. Un database che supporta un'applicazione di registrazione e pianificazione in tempo reale deve tenere conto delle query che richiedono secondi per restituire i dati. Non solo una funzione del server di report ha una maggiore tolleranza per query complesse e lunghe, ma le strategie per migliorare le prestazioni sono molto diverse.

Ad esempio, in un ambiente applicativo basato sulle transazioni, le opzioni di miglioramento delle prestazioni potrebbero includere il refactoring delle procedure memorizzate e le strutture delle tabelle all'ennesima potenza o lo sviluppo di una strategia di memorizzazione nella cache per piccole quantità di dati comunemente richiesti. In un ambiente di reportistica puoi certamente farlo ma puoi avere un impatto ancora maggiore sulle prestazioni introducendo un meccanismo di snapshot in cui viene eseguito un processo pianificato e memorizza report preconfigurati e gli utenti accedono ai dati di snapshot senza stress sul tuo livello db su una base per richiesta.

Tutto questo è una lunga propensione per illustrare che quali principi di progettazione e trucchi che utilizzi possono differire dato il ruolo del db che stai creando. Spero sia utile.


1
1. Grazie, è rassicurante! 2 e 3. Non so ancora come funzionano gli indici, è qualcosa che ho pianificato di leggere. Se mai avremo il "problema" di raggiungere un milione di dischi, probabilmente ci sarà un budget per assumere sviluppatori esperti: P Grazie per la comprensione dei diversi ruoli db esistenti, è tutto nuovo per me e molto interessante da sapere. Esaminerò le istantanee in quanto ciò che descrivi è fondamentalmente l'obiettivo finale del progetto.
bob esponja,

Se capisci le tabelle, i fondamenti degli indici sono abbastanza facili. Concettualmente, un indice può essere (e spesso viene) implementato come una tabella con pochissime colonne il cui contenuto viene copiato dalla tabella principale e un riferimento alla tabella principale, le cui righe sono ordinate per una rapida accessibilità. B + Tree è la disposizione dell'indice più comune, ma le ottimizzazioni dell'indice sono quelle in cui i grandi attori hanno le loro tecnologie di differenziazione, quindi diventa oscuro se provi ad applicare l'analogia troppo in profondità.
pojo-guy,

14

Hai l'idea giusta. Puoi comunque ripulirlo e rimuovere alcune delle tabelle di mappatura (ha *).

Quello che puoi fare è nella tabella Dipartimenti, aggiungere CityId e DivisionId.

Oltre a ciò, penso che tutto vada bene ...


4
Penso che abbia bisogno delle tabelle di mappatura se vuole riutilizzare una definizione di dipartimento in diverse divisioni o città.
Jacob G,

1
Sì, sono d'accordo ..... ma sembrava che un dipartimento potesse essere solo in una città / divisione. Altrimenti, ciò che aveva era decisamente corretto.
Reverendo Gonzo,

Ho un articolo wiki che ho scritto con una "specifica" in ufficio, dovrò leggerlo di nuovo, ma Jacob G ha ragione, IIRC ci sono alcuni dipartimenti che abbracciano le divisioni. Un reparto risorse umane del genitore ACME sia per l'assistenza sanitaria ACME che per la cura del corpo ACME. Se posso semplificarlo, anche se sicuramente lo farò, grazie per il suggerimento.
bob esponja,

6

Le uniche modifiche che vorrei fare sono:
1- Cambia il tuo VARCHAR in NVARCHAR, se potresti diventare internazionale, potresti voler unicode.

2- Se possibile, modifica i tuoi ID int in GUID (uniqueidentifier) ​​(questa potrebbe essere solo la mia preferenza personale). Supponendo che alla fine arrivi al punto in cui hai più ambienti (dev / test / staging / prod), potresti voler migrare i dati dall'uno all'altro. Gli ID GUID lo rendono notevolmente più semplice.

3- Tre livelli per la tua azienda -> Divisione -> La struttura del dipartimento potrebbe non essere sufficiente. Ora, questo potrebbe essere un eccesso di ingegneria, ma potresti generalizzare quella gerarchia in modo tale da poter supportare livelli di profondità n. Questo renderà alcune delle tue domande più complesse, quindi potrebbe non valere il compromesso. Inoltre, è possibile che qualsiasi client con più livelli possa essere facilmente "impacchettabile" in questo modello.

4- Nella tabella client è presente anche uno stato che è un VARCHAR e non ha alcun collegamento alla tabella degli stati. Mi aspetterei un po 'più di chiarezza su ciò che rappresenta lo stato del cliente.


1- Grazie, ho avuto problemi con i segni diacritici e UTF8 per i quali avrei pubblicato un'altra domanda. Forse questo è il problema. 2- Ho letto alcune altre domande qui su SO con molte opinioni contrastanti sulla questione, farò più letture sull'argomento. 3- Ne parlerò di nuovo con mio padre, guardando le "specifiche" che ho scritto e vedo se questo è qualcosa che dovremmo esaminare.
bob esponja,

4 - Non ho approfondito la domanda principale per brevità: lo stato sul client è se sono attivi (hanno sessioni rimaste) o inattive (non rimangono sessioni). Per maggiore chiarezza, intendi un nome più descrittivo per il col? Ad esempio enrolment_status? Grazie per il tuo contributo.
bob esponja,

re # 4- Oltre al tuo nome più chiaro, se ci sono solo due stati, attivo / inattivo, perché non trasformarlo in una colonna di bit?
Jacob G,

3
Non sono d'accordo con i GUID, brividi. Possono essere orribili per le prestazioni. Non usarli a meno che non sia necessario sostituirli.
HLGEM,

1
La performance entra in gioco solo quando parli di 10 milioni di righe in una tabella. Se hai quel tipo di struttura, puoi mitigarlo con guide sequenziali e indicizzazione creativa. Altrimenti, "performance" è un'aringa rossa durante l'attualizzazione dei GUID.
Jacob G,

6

No. Sembra che tu stia progettando con un buon livello di dettaglio.

Penso che i Paesi e le Aziende siano davvero la stessa entità nel tuo design, così come le Città e le Divisioni. Mi sbarazzerei delle tabelle di Paesi e Città (e Cities_Has_Departments) e, se necessario, aggiungerei una bandiera booleana IsPublicSector alla tabella Companies (o una colonna CompanyType se ci sono più opzioni rispetto al semplice settore privato / settore pubblico).

Inoltre, penso che ci sia un errore nell'utilizzo della tabella Dipartimenti. Sembra che la tabella Dipartimenti serva da riferimento ai vari tipi di dipartimenti che ogni divisione clienti può avere. In tal caso, dovrebbe essere chiamato DepartmentTypes. Ma i tuoi clienti (che sono, presumo, partecipanti) non appartengono a un dipartimento TIPO, appartengono a un'istanza di reparto effettiva in un'azienda. Così com'è ora, saprai che un determinato cliente appartiene a un reparto risorse umane da qualche parte, ma non quale!

In altre parole, i clienti dovrebbero essere collegati alla tabella che si chiama Divisions_Has_Departments (ma che chiamerei semplicemente Dipartimenti). In tal caso, è necessario comprimere le città in divisioni come discusso sopra se si desidera utilizzare l'integrità referenziale standard nel database.


La tabella dei paesi è per se / quando abbiamo clienti che operano in più di un paese e che dispongono di un reparto risorse umane diverso per ognuno. In questo modo siamo in grado di creare report con i dati del paese in cui opera il dipartimento. Lo stesso vale per i dipartimenti e le città, penso che abbiamo un cliente con dipartimenti delle risorse umane separati. per le due città in cui hanno gli uffici principali. O almeno questo era il ragionamento, mi siederò e ripenserò per vedere se sono davvero necessari. Non avevo pensato a CompanyType, scoprirò se è qualcosa che dobbiamo tenere traccia.
bob esponja,

RE: depts table, la mia traccia di pensiero originale era di usarlo come dipartimenti effettivi, con il nome del dipartimento come tipo. Non mi era venuto in mente di avere solo tipi di dipartimento, il che sembra più logico. Per sapere a quale dipartimento e dove appartiene qualcuno, avevo pensato che avrebbe funzionato avere un dipartimento collegato a una città e una divisione (che è collegata a una società). Ho sbagliato? Per far crollare le città in divisioni, alcune divisioni si estendono su più città e penso che forse anche paesi. Ci penserò di nuovo. Grazie per il tuo contributo.
bob esponja,

5

A proposito, vale la pena notare che se stai già generando CSV e vuoi caricarli in un database mySQL, LOAD DATA LOCAL INFILE è il tuo migliore amico: http://dev.mysql.com/doc/refman/5.1/ it / load-data.html . Anche Mysqlimport merita di essere esaminato, ed è uno strumento da riga di comando che è sostanzialmente un buon wrapper per il caricamento dei dati.


3

Molte cose sono già state dette, ma sento che posso aggiungere una cosa: è abbastanza comune per gli sviluppatori più giovani preoccuparsi un po 'troppo delle prestazioni in anticipo, e la tua domanda sull'unione dei tavoli sembra andare in quella direzione. Questo è un anti-modello di sviluppo software chiamato ' Ottimizzazione precoce '. Prova a bandire quel riflesso dalla tua mente :)

Ancora una cosa: credi di aver davvero bisogno delle tabelle "città" e "paesi"? Una colonna "città" e "paese" nella tabella dei dipartimenti non sarebbe sufficiente per i tuoi casi d'uso? Ad esempio, l'applicazione deve elencare i dipartimenti per città e città per paese?


1
Per quanto ci provi, continua a prendere ove calcola una grande O di helloworld.c, ottimizza le tabelle delle città e dei paesi che si sono appena generate mentre stavo seguendo i passaggi per ottenere un database 3NF. Immagino che il vantaggio che offrono sia la coerenza per i nomi di città / paesi. Come se avessimo un cliente a Monaco e per qualche ragione chiunque inserisca un nuovo studente nel sistema di programmazione decide di chiamarlo München anziché Monaco come per gli studenti precedenti. Inoltre potremmo aver bisogno di elencare i dipartimenti per città, dovrò controllare. Grazie.
bob esponja,

2
L'ottimizzazione in fase di progettazione di un database è fondamentale! Non si tratta di un'ottimizzazione prematura poiché i database sono significativamente più difficili da refacotr quando hanno milioni di record.
HLGEM,

1
Non ho detto che non dovrebbe sottoporre a stress il suo progetto :)
Hans Westerbeek,

3

Seguenti commenti basati sul ruolo di Business Intelligence / Reporting Specialist e responsabile della strategia / pianificazione:

  1. Sono d'accordo con la direzione di Larry sopra. IMHO, non è molto ingegnerizzato, alcune cose sembrano un po 'fuori posto. Per semplicità, taggerei il cliente direttamente su un ID azienda, descrizione reparto, descrizione divisione, ID tipo reparto, ID tipo divisione. Utilizzare l'ID del tipo di reparto e l'ID del tipo di divisione come riferimenti alle tabelle di ricerca e ai campi di reporting / analisi interni per coerenza a lungo termine.

  2. La tabella dei pacchetti contiene la colonna "Credito", non dovrebbe in realtà essere legata alla tabella di base del Cliente, quindi se hanno molti pacchetti puoi vedere quanto credito è dovuto per le classi future? L'applicazione può occuparsi del calc e archiviarlo centralmente nella tabella Client.

  3. Le informazioni sull'azienda potrebbero utilizzare molti più campi, incluso l'indirizzo / telefono / ecc. Ovvio. informazione. Sarei anche pronto ad aggiungere nelle colonne "DUN" di D&B (Site / Branch / Ultimate) a lungo termine, Dun e Bradstreet (D&B) hanno un enorme catalogo di società e scoprirai in seguito lungo la strada che le loro informazioni sono molto utili per report / analisi. Questo risolverà il problema della divisione multipla che menzionerai e ti permetterà di arrotolare la loro gerarchia per sub / divisione / filiali / ecc. di grandi corpi.

  4. Non menzionate quanti record con cui lavorerete, il che potrebbe implicare la preparazione di una grande iniziativa di sviluppo che avrebbe potuto essere fatta più rapidamente e molti meno mal di testa con il software di "reporting" preconfezionato. Se non hai a che fare con un database di grandi dimensioni (<65000), assicurati che MS-Access, OpenOffice (Base) o le relative soluzioni di sviluppo report / app non possano fare il trucco. Io uso il software APEX gratuito di Oracle un po 'da solo, viene fornito con il loro database gratuito Oracle XE, basta scaricarlo dal loro sito.

  5. Cordiali saluti - Analisi dei report: per database di grandi dimensioni, in genere sono disponibili due istanze di database a) database di transazioni per la registrazione di ogni record dettagliato. b) database di report (data mart / data warehouse) ospitati su una macchina separata. Per ulteriori informazioni, cerca su Google sia Star Schema che Snowflake Schema.

Saluti.


1. Intendi aggiungere tutte quelle colonne alla tabella client? Penso che ciò spezzerebbe la normalizzazione e renderebbe difficile mantenere la coerenza, ma non sono sicuro di aver capito bene. 2. I pacchetti sono sequenziali, solo i pacchetti più recenti possono avere credito in sospeso, quindi non è necessario tracciare più pacchetti. Consiglieresti comunque di memorizzarlo nella tabella client in questo caso? 3. Sembra che sarà molto utile capire la struttura delle aziende clienti, lo esaminerò grazie.
bob esponja,

4. Dovrò controllare il numero di clienti e sessioni che ci aspettiamo di avere nel prossimo anno, ma mi sembra fattibile per la tabella delle sessioni raggiungere così tante righe in circa un anno. Esaminerò il software di segnalazione, non mi era venuto in mente. 5. Sembra che questa sia la situazione in cui sono arrivato per caso; l'app web sarà il nostro "database delle transazioni" e questo progetto il nostro "database di reputazione" :) Grazie per il tuo contributo.
bob esponja,

1. Sì, aggiungendo le colonne "ID azienda, descrizione reparto, descrizione divisione, ID tipo reparto, ID tipo divisione" alla tabella client. Il cliente appartiene a una società, un tipo di reparto distinto (IT / Ops / Admin / ecc.) All'interno di una società e un tipo di divisione distinto (vendite / HR / Marketing linee di business). 2. Penso solo che il credito sia associato a un cliente o un'azienda e non al pacchetto di sessioni. Questa è una decisione aziendale che puoi prendere.
Sarà il

Larry ha anche menzionato la combinazione tra Azienda e Paese. Sono totalmente d'accordo e torno al punto relativo al riferimento D&B. Vorrei utilizzare un SiteID o qualcosa di unico per consentire più posizioni della stessa azienda e quindi collegare i Dipartimenti a uno dei SiteID univoci.
Sarà il

2

Voglio affrontare solo la preoccupazione che unirmi alle tabelle multiple determinerà un successo nelle prestazioni. Non abbiate paura di normalizzare perché dovrete fare join. I join sono normali e previsti nei database relazionali e sono progettati per gestirli correttamente. Sarà necessario impostare relazioni PK / FK (per l'integrità dei dati, questo è importante da considerare nella progettazione) ma in molti database gli FK non vengono automaticamente indicizzati. Dal momento che verranno utilizzati nei join, sarà sicuramente necessario iniziare indicizzando l'FKS. I PK generalmente ottengono un indice alla creazione in quanto devono essere unici. È vero che la progettazione del datawarehouse riduce il numero di join, ma di solito non si arriva al punto di immagazzinamento dei dati fino a quando non si ha accesso a milioni di record in un report. Anche in questo caso quasi tutti i data warehouse iniziano con un database transazionale per raccogliere i dati in tempo reale e quindi i dati vengono spostati nel magazzino secondo una pianificazione (notturna o mensile o qualunque sia la necessità aziendale). Quindi questo è un buon inizio anche se è necessario progettare un data warehouse in un secondo momento per migliorare le prestazioni dei report.

Devo dire che il tuo design è impressionante per uno studente CS del primo anno.


1

Non è troppo ingegnerizzato, è così che affronterei il problema. L'adesione va bene, non ci sarà un grande impatto sulle prestazioni (è completamente necessario a meno che non si de-normalizzi il database che non è raccomandato!). Per gli stati, vedere se è possibile utilizzare un tipo di dati enum invece di ottimizzare quella tabella.


gli enum sono cattivi. Ogni volta che devi estendere l'enum, devi ricostruire il tuo tavolo, il che è OK fino a quando il tuo tavolo diventa di molti GB.
Martin,

Grazie per il contributo e il suggerimento Chris, ero preoccupato che avrei creato un mostro troppo complesso. Martin, gli stati sono piuttosto ben definiti e statici: sostanzialmente 0-Complete class, 1-Class cancelled, 2-Did't up up. Penso che questi tre coprano ogni possibile risultato di una lezione. È ancora una cattiva idea usare enum in questo caso?
bob esponja,

Questo sembra perfetto per un enum, nella mia mente. Tutti i possibili risultati sono soddisfatti in anticipo. Anche un int va bene, che puoi rappresentare con un enum o ints statici nella tua app. Non importa davvero :) Gli enum sono più belli da guardare se modifichi il tuo database usando qualche strumento.
Chris Dennett,

enum può essere problematico (forse il male è una parola troppo forte) quando hai grandi tavoli che devono essere online 24x7 e l'enum deve essere cambiato. Dato che stai ripopolando i tavoli da zero, non preoccuparti. Dato un set di dati abbastanza piccolo, potresti anche usare solo stringhe.
Martin,

1

Ho lavorato nel campo della formazione / scuola e ho pensato di sottolineare che esiste generalmente una relazione M: 1 tra ciò che chiamate "sessioni" (istanze di un determinato corso) e il corso stesso. In altre parole, il tuo catalogo offre il corso ("Spanish 101" o altro), ma potresti avere due diversi casi durante un singolo semestre (Tu-Th, tenuto da Smith, Mer-Ven, tenuto da Jones).

A parte questo, sembra un buon inizio. Scommetto che scoprirai che il dominio client (grafici che portano ai "clienti") è più complesso di quello che hai modellato, ma non esagerare con questo fino a quando non avrai alcuni dati reali per guidarti.


Se ti ho capito correttamente non è proprio il caso. I "corsi" sono solo gruppi di sessioni successive. Non è un sistema tradizionale basato su semestre. Non riesco a pensare a nient'altro che possa essere aggiunto al dominio client, hai qualche esempio? Inoltre, ero preoccupato di aver già esagerato con la complessità, felice che non fosse il caso :) Grazie per il tuo contributo.
bob esponja,

0

Mi sono venute in mente alcune cose:

  1. I tavoli sembravano orientati alla rendicontazione, ma non gestivano realmente l'attività. Penserei che quando un cliente si iscrive, c'è essenzialmente un ordine che viene effettuato per il cliente che frequenta un elenco di sessioni e quell'ordine potrebbe essere per più dipendenti in una società. Sembrerebbe che una tabella di "ordine" sia davvero al centro del tuo sistema e favorisca l'acquisizione dei dati e l'eventuale reportistica. (Confronta i documenti cartacei che hai utilizzato per gestire l'azienda con il design del tuo database per vedere se c'è una corrispondenza logica.)

  2. Le aziende spesso non hanno divisioni. I dipendenti a volte cambiano divisioni / dipartimenti, forse anche a metà sessione. Le aziende a volte aggiungono / eliminano / rinominano divisioni / dipartimenti. Assicurati che l'eventuale modifica in tempo reale dei contenuti delle tue tabelle non renda difficili i successivi rapporti / raggruppamenti. Con così tanti dati di contatto suddivisi su così tante tabelle, potresti dover applicare una convalida molto rigorosa dell'immissione dei dati per mantenere i tuoi rapporti significativi e inclusivi. Ad esempio, quando viene aggiunto un nuovo cliente, assicurandosi che la sua azienda / divisione / dipartimento / città corrisponda agli stessi valori dei suoi colleghi.

  3. Il concetto di "pacchetti" non è affatto chiaro.

  4. Dato che indichi che è una piccola impresa, sarebbe sorprendente se le prestazioni fossero un problema, considerando la velocità e la capacità delle macchine attuali.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.