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

После просмотра ваших комментариев кажется, что вам нужно row_number()

  with cte as 
   ( 
    SELECT *,row_number() over(partition by date order by amount desc)rn
   from payment t1
   ) select * from cte where cte.rn=1
8
задан Glorfindel 24 February 2019 в 17:00
поделиться

6 ответов

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

общественность установлена на 1 для Uni в системе, и 0 для user-entered-unis.

6
ответ дан 5 December 2019 в 21:23
поделиться

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

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

SELECT DISTINCT(University) FROM Profiles

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

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

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

2
ответ дан 5 December 2019 в 21:23
поделиться

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

1
ответ дан 5 December 2019 в 21:23
поделиться

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

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

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

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

1
ответ дан 5 December 2019 в 21:23
поделиться

Это не проблема проектирования баз данных. Это - проблема UI.

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

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

-1
ответ дан 5 December 2019 в 21:23
поделиться

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

Я сделал это довольно много раз на работе и просто выбираю между любым выпадающий список текстового поля. Если данные вводятся в текстовое поле затем, я сначала вставляю в базу данных и затем использую ИДЕНТИФИКАЦИОННЫЕ ДАННЫЕ для получения уникального идентификатора той вставленной строки для дальнейших запросов.

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

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

-2
ответ дан 5 December 2019 в 21:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: