Quali sono le migliori pratiche nella progettazione di database quando voglio memorizzare un valore che è selezionato da un elenco a discesa o inserito dall'utente?

StackOverflow https://stackoverflow.com/questions/406550

Domanda

Sto cercando di trovare il modo migliore per progettare il database al fine di consentire il seguente scenario:

  1. All'utente viene presentato un elenco a discesa delle università (ad esempio)
  2. L'utente seleziona la propria università dall'elenco se esiste
  3. Se l'università non esiste, dovrebbe inserire la propria università in una casella di testo (una specie di come Altro: [___________])

come dovrei progettare il database per gestire tale situazione dato che potrei voler ordinare usando ad esempio l'ID universitario (probabilmente solo per le università integrate e non quelle immesse dagli utenti)

grazie!

Voglio solo renderlo simile a come Facebook gestisce questa situazione. Se l'utente seleziona la sua istruzione (digitando nella casella combinata che non è la mia preoccupazione) e scegliendo uno dei valori restituiti, cosa farebbe Facebook?

A mio avviso, inserire UserID e EducationID in una tabella molti-a-molti. Ora cosa succede se l'utente sta entrando non è affatto nel database? È ancora memorizzato nel suo profilo, ma dove? digitando "St" ... suggerendo Stanford

 digitando università inesistente

È stato utile?

Soluzione

CREATE TABLE university
(
  id smallint NOT NULL,
  name text,
  public smallint,
  CONSTRAINT university_pk PRIMARY KEY (id)
);

CREATE TABLE person
(
  id smallint NOT NULL,
  university smallint,
  -- more columns here...
  CONSTRAINT person_pk PRIMARY KEY (id),
  CONSTRAINT person_university_fk FOREIGN KEY (university)
      REFERENCES university (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
);

pubblico è impostato su 1 per Unis nel sistema e 0 per utente inserito-unis.

Altri suggerimenti

potresti imbrogliare: se non sei preoccupato per l'integrità referenziale di questo campo (cioè è solo lì per apparire nel profilo di un utente e non è richiesto per regole aziendali rigorosamente applicate) , memorizzalo come una semplice colonna VARCHAR.

Per il tuo menu a discesa, utilizza una query come:

SELECT DISTINCT(University) FROM Profiles

Se si desidera filtrare errori di battitura o singoli, provare:

SELECT University FROM PROFILES
GROUP BY University
HAVING COUNT(University) > 10  -- where 10 is an arbitrary threshold you can tweak

Usiamo questo codice in uno dei nostri database per archiviare le descrizioni commerciali delle società appaltatrici; poiché questo è solo informativo (esiste un campo separato "Categoria" per l'applicazione delle regole aziendali) è una soluzione accettabile.

Mantieni un flag per le righe immesse tramite l'input dell'utente nella stessa tabella degli altri punti dati. Quindi puoi ordinare usando la bandiera.

In un modo questo è stato risolto in un'azienda precedente in cui ho lavorato:

Crea due colonne nella tua tabella:  1) un ID nullable della stringa fornita dal sistema (memorizzata in una tabella separata)  2) la stringa fornita dall'utente

Viene popolato solo uno di questi. Un vincolo può imporre questo (e inoltre che almeno una di queste colonne è popolata se appropriato).

Va ??notato che il problema che stavamo risolvendo con questo era un vero " Altro: " situazione. Era una descrizione testuale di un oggetto con alcune impostazioni predefinite. La tua situazione suona come un'entità reale che non è nell'elenco, ecc. più utenti potrebbero voler inserire la stessa università.

Questo non è un problema di progettazione del database. È un problema di interfaccia utente.

L'elenco a discesa delle università si basa sulle righe di una tabella. La tabella deve contenere una nuova riga quando l'utente digita una nuova università nella casella di testo.

Se desideri separare l'elenco che hai fornito da quelli aggiunti dagli utenti, puoi avere una colonna nella tabella dell'Università con origine (o provenienza) dei dati.

Non sono sicuro che la domanda sia molto chiara qui.

L'ho fatto un bel po 'di volte al lavoro e seleziono semplicemente l'elenco a discesa di una casella di testo. Se i dati vengono immessi nella casella di testo, inserisco prima nel database e quindi utilizzo IDENTITÀ per ottenere l'identificatore univoco di quella riga inserita per ulteriori query.

INSERT INTO MyTable Name VALUES ('myval'); SELECT @@SCOPE_IDENTITY()

Questo è contro MS SQL 2008, tuttavia, non sono sicuro che il globale @@ SCOPE_IDENTITY () esista in altre versioni di SQL, ma sono sicuro che ci sono equivalenti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top