2010-11-06 18 views
8

sto creando una tabella di database che sta per memorizzare i collegamenti di menu che verranno visualizzati in una pagina Web.Come mantenere l'ordine dei record in una tabella di database

Il mio problema è che voglio controllare l'ordine delle voci del menu. Potrei avere un campo chiamato ordine ma ogni volta che ho un nuovo link al menu dovrei inserire l'ordine e cambiare tutti i record con un ordine superiore a +1.

Ad esempio, consente di dire che voglio i link (in questo ordine):

 
Home 
About 
Products 
Shopping 

ho potuto avere un tavolo chiamato menulinks e hanno le colonne: Nome, Ordine

mia il dato sarebbe il seguente:

 
Name  Order 
Home  1 
About  2 
Products 3 
Shopping 4 

ma se volessi ora aggiungere un nuovo collegamento calle d ContactUs ma volevo presentarmi proprio sotto casa.

qualcuno può pensare a un modo migliore per memorizzare un elenco che richiede l'ordine in una tabella di database senza questo noioso sforzo di manutenzione.

risposta

6

Ritengo che ciò sia correlato al problema generale dell'utilizzo di un array rispetto a un elenco collegato. Cosa ne pensi di memorizzare una chiave esterna facendo riferimento al prossimo record nella stessa tabella? Questo è l'approccio della lista collegata.

Per l'esempio non ci sono troppe schede quindi un approccio basato su array dovrebbe funzionare correttamente. Ma per qualcuno che ha centinaia di record può essere utile usare una chiave esterna autoreferenziale.

ID Name  NExT 
1 Home  2 
2 About  3 
3 Products 4 
4 Shopping NULL 

Aggiunta ed eliminazione righe sarà simile all'inserimento lista collegata e cancellazione.

Aggiornamento: tabella modificata

ID Name  NExT 
1 Home  5 
2 About  3 
3 Products 4 
4 Shopping NULL 
5 Contact us 2 

L'ordine sarà 1> 5> 2> 3> 4 come determinato dalla colonna successiva. Puoi anche usare una colonna precedente che la renderà simile a una lista doppiamente collegata.

+0

il problema qui è che non risolve il problema. effettuare una modifica richiede l'aggiornamento di tutti i record> quella riga – leora

+2

Nessuna modifica non richiede l'aggiornamento di tutte le righe. Se aggiungi Contattaci dopo Home, la tabella vorrebbe come mostrato. Aggiornata la risposta. –

+0

È come un aggiornamento dell'elenco collegato. –

5

Senza un ordine BY, non è possibile garantire l'ordine dei dati, in genere, senza un ordine, si baserà sull'ordine di inserimento.

Purtroppo, non esiste alcuna convenzione che funzioni bene per un ordinamento personalizzabile dall'utente.
Uno potrebbe usare le funzioni di analisi/posizionamento di finestre/classifica come ROW_NUMBER, ma dipende dal supporto di dati e database (MySQL non supporta le funzioni analitiche, Oracle 9i +/PostgreSQL 8.4 +/SQL Server 2005+ fa). Ma le funzioni analitiche non sono d'aiuto se vuoi che una voce che inizia con "B" appaia prima di "A"/etc.

Le opzioni sono o utilizzare due affermazioni per inserire un singolo record:

UPDATE YOUR_TABLE 
    SET sort_order = sort_order + 1 
WHERE sort_order >= 2 

INSERT INTO YOUR_TABLE 
    (value, sort_order) 
VALUES('new value', 2) 

... o eliminare i record esistenti, e reinserire la lista nel nuovo ordine.

2

si dovrebbe considerare che quando si utilizza un elenco collegato, quindi quando si desidera riordinare uno degli elementi, è necessario aggiornare anche altri record e questo deve essere fatto in una transazione che non è affatto veloce (hai bisogno di una transazione perché tutti gli aggiornamenti devono essere completati o nessuno di essi deve essere aggiornato)
c'è un'altra soluzione per questo problema che funziona sugli elenchi piccoli.
per utilizzare questo metodo fornisci un numero a ciascuno dei tuoi record. per esempio:

Name Number 
Home  5 
About 10 
Products 15 
shopping 20 

righe con numero minore sono alla begginnig della lista e la riga con il numero più grande sarà l'ultimo elemento della vostra lista ora qui è il trucco, se si voleva riordinare la prodotti fila e inserirlo tra l'casa e Chi tutto quello che dovete fare è modificare il campo numero del prodotto di essere uguale al numero compreso tra casa e Chi numero
Home numero è 5 e lo Chi numero è 10 in modo che il campo Numero di prodotto sarà (5 + 10)/2 = 7,5

Name Number 
Home  5 
About 10 
Products 7.5 
shopping 20 

e ora è possibile ordinare la finale elenco, in base al numero Numero

Problemi correlati