Crea un database per le tabelle del database

1

Sto lavorando a un progetto in cui devo dare agli utenti la possibilità di costruire i propri tavoli, ogni utente può creare più di una tabella.

(il tipo di tutti i dati è stringa).

L'utente può creare una tabella e specificare le colonne che desidera al suo interno.

Qual è il modo migliore per farlo:

  1. per creare database dinamicamente

  2. per avere una tabella per le tabelle (chiave, valore ...).

  3. qualcos'altro

Un altro problema è: è meglio separare il mio database in due, quindi uno è per uso interno (utenti, account, ....) e l'altro è per le tabelle degli utenti (o per la tabella di tabelle)?

    
posta HasanAboShally 22.04.2013 - 12:20
fonte

4 risposte

1

Penso che l'approccio più sano sarebbe avere un database per ciascun utente. La maggior parte dei database è progettata per gestire la sicurezza molto meglio se un utente ha il potere sul proprio database e nient'altro (si vorrà utilizzare uno speciale utente di back-end per poter creare il database, creare l'utente e assegnare permessi per quell'utente di accedere a quel database - qualsiasi altra cosa è un rischio per la sicurezza ).

Ogni utente avrà il proprio database con le autorizzazioni per modificare solo quel database. Questo rende tutto molto più semplice. Non è più necessario trasformare tutto virtuale poiché la maggior parte dei problemi sul database si può semplicemente inoltrare all'utente. È necessario un database master che tenga traccia degli utenti, delle autorizzazioni e dei relativi database. Molti database offrono meta informazioni, ma non lo consiglierei di usarlo, almeno non per gli utenti, dal momento che qualsiasi informazione aggiuntiva dovresti gestirti comunque, e quindi probabilmente stai facendo quello che dovresti fare alla fine comunque.

Una cosa che non dovresti salvare in master a questo punto è una tabella di tabelle - Questo, dovresti davvero lasciarlo al database da gestire. Se hai bisogno di un elenco di tabelle, puoi interrogare la meta per queste informazioni.

A questo punto, l'unica vera preoccupazione sono i conflitti tra i nomi dei database. Per risolvere questo, potresti fare una delle tante cose:

  1. Fornisci il nome tu stesso. Sarà un brutto nome e questa non è la decisione più popolare per gli utenti, ma è la più semplice da fare.
  2. Lascia che forniscano il nome e esegui una sorta di mappatura del nome da virtuale a reale che crei tu stesso. Questo è abbastanza semplice, con l'eccezione che è necessario analizzare le query e sostituire il nome da soli (non lo consiglio!)
  3. Aggiungi il nome utente sul lato sinistro del nome del database che selezionano quindi non c'è alcuna possibilità di nomi in conflitto (usa una sorta di divisore di caratteri che non può essere usato nel nome del database per non doversi preoccupare degli utenti "me" con database "atloaf" e utente "meat" con database "pagnotta" che crea lo stesso nome).

Questa è ovviamente una soluzione pesante per il database in quanto ci si basa principalmente sul motore del database per portare la logica dietro ciò che è possibile e impossibile realizzare, quindi consiglio vivamente di sapere come mantenere il database (la sicurezza è un maggiore priorità qui) che alla fine scegli.

Con il passare del tempo, è possibile sovrascrivere determinate funzionalità se si richiedono determinati comportamenti che non è possibile ottenere normalmente con un database, ma questo approccio è sicuramente vantaggioso in quanto si ha già un sacco di logica completata per voi con poco o nessun tweaking.

    
risposta data 22.04.2013 - 12:56
fonte
0

Quanti utenti ti aspetti? Vorrei sconsigliare la creazione di nuove tabelle per gli utenti. Questo potrebbe creare un database molto grande piuttosto rapidamente.

Dai un'occhiata al modello EAV (Entity-attribute-value). Questo è abbastanza flessibile. link .

In questo modo, puoi avere una tabella che memorizza le tabelle degli utenti.

    
risposta data 22.04.2013 - 12:45
fonte
0

Avrei solo una tabella per users e una tabella per user_columns .

L'intera nozione di utenti che aggiunge dinamicamente le tabelle non è una che vorrei affrontare.

La tabella user_columns avrebbe user_id come chiave esterna non univoca, oltre a colonne come description , timestamp, ecc.

In questo modo aggiungi e rimuovi solo le righe da user_columns in base alle esigenze.

    
risposta data 19.05.2013 - 00:11
fonte
0

Dovresti anteporre la tabella al nome utente come pattern userName_tableName. userName sarà il nome dell'utente che ha creato la tabella.

    
risposta data 18.05.2013 - 23:14
fonte

Leggi altre domande sui tag