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

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

Вопрос

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

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

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

Спасибо!

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

На мой взгляд, это позволило бы вставить userId и EducationID в таблицу "многие ко многим".Теперь, что делать, если вводимый пользователем файл вообще отсутствует в базе данных?Оно по-прежнему хранится в его профиле, но где?typing "St"...suggesting Stanford

typing non-existing university

Это было полезно?

Решение

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 для unis, введенных пользователем.

Другие советы

Ты мог бы обманывать:если вы не беспокоитесь о ссылочной целостности этого поля (т.е.он просто отображается в профиле пользователя и не требуется для строго соблюдаемых бизнес-правил), сохраните его как простой столбец 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) обнуляемый идентификатор предоставленной системой строки (хранится в отдельной таблице) 2) предоставленная пользователем строка

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top