2009-01-02 11 views
6

Estoy tratando de encontrar la mejor manera de diseñar la base de datos con el fin de permitir que el siguiente escenario:¿Cuáles son las mejores prácticas en el diseño de db cuando quiero almacenar un valor que se selecciona de una lista desplegable o que ingresa el usuario?

  1. El usuario se le presenta una lista desplegable de Universidades (por ejemplo)
  2. el usuario selecciona su/su universidad de la lista si es que existe
  3. Si no existe la universidad, él debe entrar en su propia universidad en un cuadro de texto (algo así como Otros: [___________])

cómo debería diseñar la base de datos para manejar tal situación dada que podría querer ordenar usando el ID de la universidad, por ejemplo (probablemente solo para las universidades integradas y no las ingresadas por los usuarios)

gracias!

Solo quiero que sea similar a cómo Facebook maneja esta situación. Si el usuario selecciona su educación (escribiendo realmente el cuadro combinado que no es mi problema) y seleccionando uno de los valores devueltos, ¿qué haría Facebook?

En mi opinión, insertaría el ID de usuario y el ID de educación en una tabla de muchos a muchos. Ahora, ¿qué sucede si el usuario ingresa no está en la base de datos? Todavía está almacenado en su perfil, pero ¿dónde? typing "St"...suggesting Stanford http://i43.tinypic.com/hufztt.jpg

typing non-existing university http://i41.tinypic.com/14j56s8.jpg

Respuesta

5
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 
); 

público está configurado en 1 para el Unis en el sistema y 0 para el usuario ingresado.

+0

esto es lo que pensé, ¡pero quería saber si realmente se hace de esta manera! – sabbour

+0

Yo diría que sí, ya que es más simple que las alternativas. – svinto

+0

Sin embargo, necesita un recolector de basura, de lo contrario este esquema podría terminar teniendo muchas entradas huérfanas en 'university'. –

-1

Esto no es un problema de diseño de base de datos. Es un problema de UI.

La lista desplegable de universidades se basa en las filas de una tabla. Esa tabla debe tener una nueva fila insertada cuando el usuario escriba una nueva Universidad en el cuadro de texto.

Si desea separar la lista que proporcionó de las agregadas por los usuarios, puede tener una columna en la tabla de la Universidad con origen (o procedencia) de los datos.

+0

No es una mala idea. Creo que usaría una tabla separada para los datos ingresados ​​por el usuario. Use una bandera en el original para marcar cual. Mantenga un conteo en la tabla de tiempos ingresada por el usuario. Periódicamente, podría tener una tarea de mantenimiento que tomaría todo lo ingresado más de una vez y lo movería. – tvanfosson

+0

O si no hay muchas entradas o si le preocupan las entradas falsas (Universidad de Okiboji), podrían escanearse a simple vista y procesarse manualmente. – tvanfosson

+0

@tvanhfosson: la tabla separada nunca funciona bien; tiene un sinfín de consultas sindicales para fusionar los dos conjuntos de datos. Una tabla con indicadores de estado es más simple a largo plazo. –

1

Mantenga un indicador para las filas ingresadas a través de la entrada del usuario en la misma tabla que tiene sus otros puntos de datos. Luego puedes ordenar usando la bandera.

-2

No estoy seguro si la pregunta es muy clara aquí.

He hecho esto bastantes veces en el trabajo y simplemente selecciono entre la lista desplegable de un cuadro de texto. Si los datos se ingresan en el cuadro de texto, primero los inserto en la base de datos y luego uso IDENTITY para obtener el identificador único de esa fila insertada para más consultas.

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

Esto va en contra de MS SQL 2008, sin embargo, no estoy seguro de si el @@ SCOPE_IDENTITY() existe mundial en otras versiones de SQL, pero estoy seguro de que hay equivalentes.

+0

, pero ¿cómo puedo manejarlo si varios usuarios ingresan el mismo nombre de universidad? ¿Debo verificar primero si su entrada personalizada coincide con una universidad en la base de datos? – sabbour

+0

Haga que la columna de nombre de la universidad sea única, de ese modo la consulta fallará si ingresan el mismo nombre. La propiedad única es una característica de SQL que puede aplicar a la columna en la base de datos para detener el ingreso de entradas duplicadas. – Kezzer

1

Una manera en que se resolvió en una empresa anterior que trabajó en:

Crear dos columnas en la tabla: 1) un identificador de anulable de la cadena suministrada por el sistema (almacenada en una tabla separada) 2) la cadena suministrada por el usuario

Solo se incluye uno de estos. Una restricción puede hacer cumplir esto (y, además, que al menos una de estas columnas se rellena, si corresponde).

Cabe señalar que el problema que estábamos resolviendo con esto era una verdadera situación de "Otro:". Era una descripción textual de un artículo con algunos valores predeterminados preestablecidos. Su situación suena como una entidad real que no está en la lista, s.t. más de un usuario podría querer ingresar a la misma universidad.

+0

esto podría ser otra pregunta pero no es almacenar valores NULOS en las filas algo malo que hacer? – sabbour

+0

Sí, exactamente, quiero saber cómo Facebook maneja esta situación cuando un usuario modifica su perfil para ingresar información de trabajo o educación. – sabbour

+0

@NULLs en filas: mientras los espere, no –

2

Usted podía tramposo: si no está preocupado por la integridad referencial de este campo (es decir, que sólo está ahí para aparecer en el perfil de un usuario y no se requiere para las reglas de negocio estrictamente obligatoria), almacenarla como una simple columna VARCHAR.

Para su desplegable, utilice una consulta como:

 
SELECT DISTINCT(University) FROM Profiles 

Si desea filtrar los errores tipográficos o medidas excepcionales, tratar:

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

Utilizamos este código en una de nuestras bases de datos para almacenar las descripciones comerciales de las empresas contratistas; dado que esto es solo informativo (hay un campo "Categoría" separado para hacer cumplir las reglas comerciales) es una solución aceptable.

Cuestiones relacionadas