Каковы лучшие практики в дизайне БД, когда я хочу сохранить значение, выбранное из выпадающего списка или введенное пользователем? - PullRequest
7 голосов
/ 02 января 2009

Я пытаюсь найти лучший способ проектирования базы данных, чтобы разрешить следующий сценарий:

  1. Пользователю предоставляется раскрывающийся список университетов (например)
  2. Пользователь выбирает свой университет из списка, если он существует
  3. Если университет не существует, он должен ввести свой собственный университет в текстовое поле (вроде как Другое: [___________])

как мне спроектировать базу данных, чтобы справиться с такой ситуацией, учитывая, что я мог бы хотеть сортировать, используя, например, идентификатор университета (вероятно, только для встроенных университетов, а не введенных пользователями)

спасибо!

Я просто хочу, чтобы это было похоже на то, как Facebook справляется с этой ситуацией. Если пользователь выберет свое Образование (фактически введя в выпадающий список, который меня не касается) и выбрав одно из возвращаемых значений, что сделает Facebook?

По-моему, он вставил бы UserID и EducationID в таблицу «многие ко многим». Что теперь, если пользователь вводит, не находится в базе данных вообще? Он до сих пор хранится в его профиле, но где? typing

typing non-existing university

Ответы [ 6 ]

6 голосов
/ 02 января 2009
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
);

public установлен в 1 для Unis в системе и 0 для user-input-unis.

2 голосов
/ 02 января 2009

Вы могли бы обмануть: если вас не беспокоит ссылочная целостность этого поля (т. Е. Оно просто отображается в профиле пользователя и не требуется для строго обязательных бизнес-правил) сохраните его как простой столбец VARCHAR.

Для вашего раскрывающегося списка используйте запрос вроде:

SELECT DISTINCT(University) FROM Profiles

Если вы хотите отфильтровать опечатки или одноразовые сообщения, попробуйте:

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

Мы используем этот код в одной из наших баз данных для хранения торговых описаний компаний-подрядчиков; так как это только информация (есть отдельное поле "Категория" для обеспечения соблюдения бизнес-правил), это приемлемое решение.

1 голос
/ 02 января 2009

Один из способов решить эту проблему в предыдущей компании, в которой я работал:

Создайте два столбца в вашей таблице: 1) обнуляемый идентификатор предоставленной системой строки (хранится в отдельной таблице) 2) пользовательская строка

Заполнен только один из них. Ограничение может обеспечить это (и дополнительно, что по крайней мере один из этих столбцов заполнен, если это необходимо).

Следует отметить, что проблема, которую мы решали, была настоящей ситуацией «Другое». Это было текстовое описание элемента с некоторыми предустановленными значениями по умолчанию. Ваша ситуация звучит как фактическая сущность, которой нет в списке, s.t. более одного пользователя могут захотеть ввести один и тот же университет.

1 голос
/ 02 января 2009

Сохраняйте флаг для строк, введенных с помощью пользовательского ввода, в той же таблице, что и другие точки данных. Затем вы можете сортировать, используя флаг.

0 голосов
/ 02 января 2009

Я не уверен, что вопрос здесь очень ясен.

Я делал это довольно много раз на работе и просто выбирал между выпадающим списком текстового поля. Если данные вводятся в текстовое поле, я сначала вставляю их в базу данных, а затем использую IDENTITY, чтобы получить уникальный идентификатор этой вставленной строки для дальнейших запросов.

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

Это против MS SQL 2008, хотя я не уверен, существует ли глобальный @@ SCOPE_IDENTITY () в других версиях SQL, но я уверен, что есть эквиваленты.

0 голосов
/ 02 января 2009

Это не проблема дизайна базы данных. Это проблема пользовательского интерфейса.

Раскрывающийся список университетов основан на строках в таблице. В этой таблице должна быть вставлена ​​новая строка, когда пользователь вводит в новом университете текстовое поле.

Если вы хотите отделить предоставленный вами список от списка, добавленного пользователями, в таблице Университета может быть столбец с происхождением (или происхождением) данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...