Come strutturare il mio modello di dati per la fusione di account

3

Il mio nuovo sito consentirà la registrazione "normale" o l'utilizzo di Facebook openauth.

Ho molte tabelle che collegano i dati a un id_utente.

Immagina che uno dei miei utenti con informazioni sul mio sito dimentichi di aver usato Facebook per creare un account. Creano un secondo account 'normale' e usano il sito per un po '. Quindi l'utente ha dati associati a due user_ids.

Voglio dare loro l'opzione di "importare" i dati associati al primo account nel nuovo account.

Questo è disordinato, e preferirei progettare le cose in modo corretto, ma non riesco a spiegarmi un modo elegante per farlo.

Ecco le opzioni che ho pensato:

  1. Permetti a un profilo utente di avere un ID master (parent?) _ e scrivi tutte le mie query db per selezionare molti user_ids. Dopo l'unione da un account a un altro, l'account perdente ottiene user_id dell'account vincente dato che è parent_id.

  2. Quanto sopra, ma più pulito: consolidare molti accessi in una tabella di ricerca

  3. Aggiornamento singolo a livello di sistema: trova tutti i dati con user_id 1 e modificalo in user_id 2. Ciò diventa progressivamente più difficile man mano che memorizziamo più dati.

  4. Unisci con perdita di dati, come # 3 ma solo dati cruciali. L'utente perde i record storici ecc.

O sto sorvolando un modo più semplice per gestire lo scenario che sto cercando di pianificare?

    
posta Jeff V 01.10.2011 - 04:20
fonte

2 risposte

1

Mantieni tutti gli ID / account di accesso separati e non unire nulla. Piuttosto avere una tabella principale che mappa le relazioni dell'utente. Aggiungi anche una colonna alla tabella Utente che punti alla tabella principale.

Table MasterUser
ID   UserID
561  1
561  2
561  3
561  4

Table User
ID Email              MasterUserID
1  [email protected]      561
2  [email protected] 561
3  [email protected]    561
4  [email protected]       561

Se l'utente effettua l'accesso con "[email protected]", puoi eseguire una ricerca utilizzando MasterUserID e visualizzare rapidamente tutti gli ID dell'utente.

La parte difficile è sapere quando chiedere all'utente di associare account. Suppongo che potresti passare alla sessione corrente. Ma cosa succede se l'utente è su un computer condiviso? Potresti voler informare l'utente via email e dare loro la possibilità di rimuovere un link se fatto per errore.

Solo alcune brevi riflessioni su come unire i dati utente al volo. Non sono sicuro che questo pseudo-codice possa effettivamente apparire fuori

AllUserIDs(@UserID)

    Declare @MasterUserID = 

    SELECT MasterUserID
    FROM MasterUser
    WHERE UserID = @UserID

    --Return list
    SELECT UserID
    FROM MasterUser
    WHERE ID = @MasterUserID
END

Potresti modificare le altre query per avere un aspetto simile a

SELECT * 
FROM TABLE
WHERE UserID in (AllUserIDs(@UserID))

Sostituzione sostanziale di @UserID con AllUserIDs (@UserID)

    
risposta data 01.10.2011 - 06:27
fonte
1

Penso di aver risposto a qualche domanda simile tempo fa, ma non riesco a trovare il link atm ..

Quello che potrei fare è creare una classe modello senza informazioni di autenticazione. Qualcosa di simile (fatto in Python / SQLAlchemy perché è quello che mi è sembrato di scrivere al momento;)):

Modello utente

class User(Base):
    __tablename__ = "user"
    user_id = Column(Integer, primary_key=True, autoincrement=True)
    fname = Column(String(50), nullable=False)
    lname = Column(String(50), nullable=False)

Modello di autenticazione utente (mantenendo i metodi di autenticazione n per ciascun utente)

class UserAuth(Base):
    __tablename__ = "user_auth"
    auth_id = Column(Integer, primary_key=True, autoincrement=True)
    user_id = Column(Integer, ForeignKey("user.user_id"), nullable=False)
    provider = Column(Integer, nullable=False)


class AuthFactory(Base):
    # the index here would match what's stored in the provider column of UserAuth
    _providers = [
        FacebookProvider,
        MySiteProvider
    ]
    def get_provider(self, id):
        return _providers[id]()

Se FacebookProvider e MySiteProvider (e qualunque altro provider tu voglia aggiungere al tuo sistema) implementano la stessa interfaccia, quindi lo scambio tra i provider è banale.

Nota: il codice sopra ovviamente non è stato testato e ci sono molti modi diversi per ottenere lo stesso risultato, questo è proprio quello che ho tirato fuori di testa. Mi piacerebbe sapere di eventuali buchi nell'idea anche se sto pensando di utilizzare questo concetto io stesso in un progetto futuro.

    
risposta data 01.10.2011 - 06:37
fonte

Leggi altre domande sui tag