Struttura base dati di un elenco di iscritti

1

Sto costruendo un'applicazione che consente a diversi utenti di memorizzare le informazioni sull'abbonato

  • Per memorizzare le informazioni sull'abbonato, l'utente prima crea un elenco Per ogni elenco, c'è un ListID.

Subscriber può avere un attributo diverso: email phone fax ....

Per ogni elenco, le loro impostazioni sono diverse, quindi viene introdotto un require_attribute table . È un ponte tra abbonato ed elenco

Quel negozio Listid, subid, attribute, datatype

Ciò significa che il sistema ha un sacco di elenchi, ogni utente ha il proprio elenco e l'elenco ha un attributo diverso, alcuni elenchi hanno e-mail, telefono, alcuni possono avere telefono, indirizzo, nome e-mail ... E il il tipo di dati è diverso, alcuni possono usare "nome" come intero, alcuni possono usare "nome" come varchar

  • attributo significa email phone, deve essere definito per which list have which subscriber attribute

  • tipo di dati per ogni attributo, qual è il suo tipo di dati

    Table :subscriber :        
    Field :subid , name,email
    
    Table :Require Attribute:
    
    Field : Listid ,subid , attribute, datatype
    

L'attributo qui è {nome, email}

Quindi un dato semplice è

Subscriber: 1 , MYname, Myemail

Require Attribute :

 Listid , 1 , 'email', 'intger'

 Listid , 1 , 'name', 'varchar'

Ho scoperto che questo tipo di storage è troppo complesso da gestire, dal momento che l'utente è condiviso da tutti, quindi se una persona vuole modificare il tipo di nome, avrà anche effetto sui dati dell'altro utente.

Semplice situazione di errore:

Subscriber:

list1,  Subscriber 1 , name1, email1

list2, Subscriber 2  , name2 , email2

Require Attribute :

     List1 , Subscriber 1 , 'email', 'varchar',

     List1 , Subscriber 1  , 'name', 'varchar', 

     Listid , Subscriber 2 , 'email', 'varchar', 

     Listid , Subscriber 2, 'name', 'integer', 

se l'utente B cambia il tipo di dati del nome nell'attributo require da varchar a integer, causa un problema. poiché l'elenco 1 è di proprietà dell'utente A, desidera che il tipo di dati sia varchar, ma l'utente 2 vince l'elenco 2, desidera che il tipo di dati sia intero

Quindi, come posso ridisegnare la struttura?

    
posta gnat 23.03.2012 - 12:41
fonte

1 risposta

1

Puoi risolvere questo problema usando qualcosa che ho chiamato una soluzione di tavolo verticale in passato. Ci sono pro e contro a questa soluzione. Posso fornire un database di esempio su richiesta.

Contro

• La perdita della struttura orizzontale rende le query difficili da scrivere e più lente da eseguire. La difficoltà di scrivere le domande può essere aiutata con le visualizzazioni. Le viste presentano anche il proprio insieme di problemi.

• L'integrità dei dati diventa più difficile. Poiché si sta definendo il tipo di dati in modo astratto in una tabella e si memorizza come il tipo più comune, in genere una qualche forma di campo di testo, si impone un onere sulla verifica dei dati sull'input. Precedentemente ho studiato utilizzando chiavi esterne per assicurare dati validi ma non ho implementato una soluzione.

• Non supporta bene le relazioni "many to one", ma può essere fatto.

Pro

• Il cliente è in grado di definire la propria definizione dei dati.

• La modifica della definizione non influisce negativamente sugli altri client. Tuttavia, se un cliente cambia il proprio tipo di dati o il significato, ci possono essere problemi.

• Può diventare 'fragile' una volta definita una lista e raccolti i dati.

Query di esempio

Select
    rst.responseSetID,
    Max(case when lvdt.CustomerFieldName = 'Email' then vst.InputValue end) as Email,
    Max(case when lvdt.CustomerFieldName = 'Name' then vst.InputValue end) as Name
From SubscriberTable st
    join ListDefinitionTable ldt on 
        st.SubID  = ldt.SubID 
    join VerticalStorageTable vst on 
        ldt.ListID = vst.ListID
    join ListValueDefinitionTable lvdt on 
        vst.ListDefintionID  = lvdt.ListDefinitionID 
    join AttributeDefinition ad on
        lvdt.AttributeTypeID = ad.AttributeTypeID
    Join ResponseSetTable rst on
        vst.ResponseSetID = rst.ResponseSetID
where 
    st.SubID = 1
    and vst.ListID = 1 
Group by
    rst.responseSetID

Tabella iscritti

• SubID (ID) (PK)

• CustomerName (testo)

Definizione attributo

• AttributeTypeID (ID) (PK)

• AttributeType (testo)

Tabella di definizione elenco

• ListID (ID) (PK)

• SubID (ID)

• CustomerListName (Testo)

Tabella di definizione del valore di lista

• ListDefinitonID (ID) (PK)

• ListID (ID)

• AttributeTypeID (ID)

• CustomerFieldName (testo)

Tabella dei set di risposta

• ResponseSetID (ID) (PK)

• SubID (ID)

• ListID (ID)

• TimeInput (DateTime) (Default - GetDate ())

Tabella di archiviazione verticale

• InputID (ID) (PK)

• ResponseSetID (ID)

• ListID (ID)

• ListDefinitonID (ID)

• InputValue (testo)

    
risposta data 23.03.2012 - 15:21
fonte

Leggi altre domande sui tag