Tabelle configurabili nel database SQL

2

Ho le seguenti tabelle nel mio database:

Tabella di configurazione:

======================================
Start_Range | End Range | Config_id
   10       |    15     |    1
======================================

Available_UserIDs

==========================
 ID | UserID | Used_YN   |
  1 |   10   |    t      |
  1 |   11   |    f      |
  1 |   12   |    f      |
  1 |   13   |    f      |
  1 |   14   |    f      |
  1 |   15   |    f      |
==========================

Users
    ==========================
     UserId | FName | LName  |
        10  |  John |  Doe   |
    ==========================

Questo è usato in un sistema di prenotazione ... che consente ad un amministratore di specificare un intervallo di numeri che saranno assegnati agli utenti nella tabella di configurazione. Una volta definito l'intervallo, il sistema popola la tabella Available_userIDs con tutti i numeri compresi nell'intervallo e imposta il flag Used_YN su false.

Quando gli utenti si registrano, afferrano il prossimo numero user_id che non è in uso ... e prenotalo Quindi il sistema aggiunge un record alla tabella Utenti.

Una volta che l'amministratore ha specificato un intervallo, è possibile che possano cambiarlo. Ad esempio, possono iniziare con 10-15 ... e poi quando l'intervallo è esaurito, dovrebbero essere in grado di specificare un altro intervallo come 16 - 99.

Ho inserito un vincolo univoco sulla tabella Available_UserIDs, nonché sulla tabella Users - per garantire che gli UserId non possano essere duplicati.

  1. Qual è il modo migliore per impedire agli amministratori di utilizzare un intervallo già in uso? Ho pensato alle seguenti opzioni:

    - Controllare la tabella Utenti per vedere se vengono utilizzati i numeri dell'intervallo di inizio o di intervallo finale. Se lo sono, supponi che tutti i numeri in mezzo siano anch'essi in uso, e rifiuta l'intervallo.

    - Permetti loro di specificare ciò che vogliono, prova a compilare la tabella Available_UserIDs. Se ci sono duplicati, ignora il messaggio di errore specifico dal database e continua.

  2. Come faccio a trovare spazi vuoti negli intervalli di numeri? Ad esempio, se specificano 10-15 e quindi 20-25, sarebbe bello essere in grado di suggerire in qualche modo sulla mia pagina web che 16-19 è attualmente disponibile.

Ho trovato l'articolo Come trovo una "distanza" nel contatore di corsa con SQL? , ma sembra solo restituire il primo numero disponibile ... quindi nel mio esempio sopra, restituirei solo il numero 16.

Sono sicuro che c'è un modo più semplice per fare cose che sto trascurando!

    
posta dot 17.10.2013 - 17:12
fonte

2 risposte

1

Se i nuovi utenti ottengono sempre il primo ID utente disponibile, non è necessario che l'amministratore specifichi l'inizio di un nuovo intervallo. Basta che l'amministratore definisca la nuova dimensione dell'intervallo, prendi il primo ID utente che non è stato ancora prenotato come inizio e aggiungi la nuova dimensione di intervallo a quella per ottenere la fine.

int range_start = max_reserved + 1;
int range_size = user_defined;
int range_end = range_start + range_size - 1;

Ciò eliminerebbe la necessità di identificare intervalli di intervallo, ma se è ancora desiderato, utilizzare la soluzione collegata per trovare il primo ID mancante, quindi cercare l'ID minimo maggiore dell'ID mancante. La fine dell'intervallo mancante sarebbe il risultato: 1.

select min(UserId) - 1 as missing_range_end
from Users
where UserId > $known_missing_id;

Se hai bisogno che i tuoi amministratori siano in grado di specificare l'inizio dell'intervallo, prima di accettare il nuovo intervallo, eseguo una query di convalida per assicurarmi che il nuovo intervallo non intersechi un altro:

select count(*) 
from Available_UserIDs 
where UserID between $new_range_start and $new_range_end;

Se ottieni dei risultati, rifiuta il nuovo intervallo.

    
risposta data 17.10.2013 - 17:47
fonte
1

What's the best way to prevent the admins from using a range that's already in use?

Forse potresti mettere dei vincoli sulla tabella di configurazione? Il primo dovrebbe avere un vincolo univoco su start_range e end_range . Ciò impedirebbe a un intervallo di avere lo stesso inizio o fine di un altro. Non ti impedisce di avere un intervallo che è un super-intervallo o sotto-intervallo di un altro intervallo. Potrebbe essere qualcosa di meglio controllare usando un trigger ON INSERT , in cui potresti dover chiamare una procedura o eseguire una query per assicurarti che il nuovo intervallo non sia un super / sub-intervallo di un intervallo esistente.

    
risposta data 17.10.2013 - 17:22
fonte

Leggi altre domande sui tag