Posso creare una query che mi permetta di fare questo?

1

Ho una tabella che memorizza le informazioni dell'utente, una colonna memorizza il loro ID. Avevo implementato quattro diversi attributi nella stessa tabella che memorizzavano un bit che indica quali operazioni di file l'utente poteva eseguire (leggi, crea, aggiorna, cancella).

Per fortuna, ho capito che era un'implementazione terribile e invece ho creato quattro diverse tabelle con una colonna (l'ID utente) che indicava quali azioni potevano eseguire. Mi preoccupa davvero il fatto che io sia infastidito dal numero esagerato di zeri. Fa risparmiare spazio, anche se è trascurabile.

Tuttavia, questo database viene anche interrogato da un'applicazione in un linguaggio OOP e uno degli oggetti creati di frequente è un utente. Questa classe memorizza naturalmente le operazioni sui file che l'utente può eseguire. Nella vecchia implementazione, questi campi oggetto (valore booleano) potevano essere rapidamente popolati dalla tabella utente, ma non ora.

Ora sono confuso su come dovrei popolare questi campi oggetto. Mi sento come se dovessi essere in grado di eseguire una singola query indicando quali tabelle di permessi l'utente appartiene, ma non riesco a trovare la sintassi di scrittura (se esiste anche).

Quindi la mia domanda è: esiste un modo per eseguire una singola query per capire quali tabelle (che consistono solo in una singola colonna) in cui si verifica un valore? O devo interrogare ogni tabella in modo indipendente per riempire questi campi oggetto?

    
posta Robert Wolfe 07.05.2014 - 10:38
fonte

2 risposte

2

Non è una buona idea separare questi attributi dalle proprie tabelle. Rende i tuoi dati non organizzati.

Se i tuoi attributi sono di tipo booleano semplice, puoi combinarli come un valore numerico. Basti pensare a ciascun attributo come a una specifica posizione di bit.

Ad esempio
leggi: 1 ° bit
creare: 2 ° bit
aggiornamento: 3 ° bit
elimina: 4 ° bit

Utilizza il binario o l'operatore per creare il valore dell'attributo.
leggi + aggiornamento = 1 | 4 = 5
leggi + cancella = 1 | 8 = 9

Per eseguire una query, puoi utilizzare questa sintassi
- trova tutti gli utenti con attributo di aggiornamento:
  seleziona * da table1 where (attribute & 4) = 4
- trova tutti gli utenti con l'attributo delete:
  seleziona * da table1 where (attribute & 8) = 8

    
risposta data 07.05.2014 - 11:23
fonte
2

I miei due centesimi:

Questo modello consente altri tipi di azioni oltre alle "azioni sui file" (operazioni, mi dispiace, avevo già creato il modello con "azione" invece di "operazione").

Laquerypervederequaliazionidelfileutente3hailpermessodieseguireè(puoifacilmentecreareunavistabasatasuquestaquerylasciandofuorilaclausolawhere):

selecta.action_codefromuserujoinpermissionpon(u.user_id=p.user_id)joinactionaon(p.action_code=a.action_code)joinaction_typeton(t.act_type_code=a.act_type_code)whereu.user_id=3andt.act_type_code='FILE';

Cheprodurràquesto:

    
risposta data 07.05.2014 - 15:43
fonte

Leggi altre domande sui tag