8

我试图找到设计数据库的最佳方法,以允许以下情况:

  1. 向用户显示大学的下拉列表(例如)
  2. 用户从列表中选择他/她的大学(如果存在)
  3. 如果大学不存在,他应该在文本框中输入他自己的大学(有点像其他:[_______________])

考虑到我可能想使用大学 ID 进行排序(可能仅适用于内置大学而不是用户输入的大学),我应该如何设计数据库来处理这种情况

谢谢!

我只是想让它类似于 Facebook 处理这种情况的方式。如果用户选择他的教育(通过实际输入我不关心的组合框)并选择返回值之一,Facebook 会做什么?

在我的猜测中,它会将 UserID 和 EducationID 插入到多对多表中。现在如果用户输入的内容根本不在数据库中怎么办?它仍然存储在他的个人资料中,但是在哪里? 打字

键入不存在的大学

4

6 回答 6

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

public 为系统中的 Unis 设置为 1,为 user-entered-unis 设置为 0。

于 2009-01-02T11:41:33.397 回答
2

可以作弊:如果您不担心该字段的引用完整性(即,它只是显示在用户的配置文件中,并且不是严格执行的业务规则所必需的),请将其存储为简单的 VARCHAR 列。

对于您的下拉列表,请使用如下查询:

从个人资料中选择 DISTINCT(大学)

如果要过滤掉拼写错误或一次性,请尝试:

从个人资料中选择大学
按大学分组
HAVING COUNT(University) > 10 - 其中 10 是您可以调整的任意阈值

我们在我们的一个数据库中使用此代码来存储承包商公司的贸易说明;因为这只是提供信息(有一个单独的“类别”字段用于执行业务规则),所以这是一个可以接受的解决方案。

于 2009-01-02T12:08:26.120 回答
1

在与其他数据点相同的表中为通过用户输入输入的行保留一个标志。然后,您可以使用标志进行排序。

于 2009-01-02T11:37:38.953 回答
1

在我以前工作的一家公司中解决了这个问题的一种方法:

在表中创建两列:1)系统提供的字符串的可为空 id(存储在单独的表中)2)用户提供的字符串

只有其中一个被填充。约束可以强制执行此操作(此外,如果适当,至少填充这些列之一)。

应该注意的是,我们正在解决的问题是真正的“其他:”情况。它是具有一些预设默认值的项目的文本描述。您的情况听起来像是一个不在列表中的实际实体,可能不止一个用户想要输入同一所大学。

于 2009-01-02T11:43:50.023 回答
-1

这不是数据库设计问题。这是一个用户界面问题。

大学的下拉列表基于表中的行。当用户在文本框中键入新大学时,该表必须插入新行。

如果您想将您提供的列表与用户添加的列表分开,您可以在 University 表中有一列包含数据的来源(或出处)。

于 2009-01-02T11:37:23.510 回答
-2

我不确定这里的问题是否很清楚。

我在工作中已经做过很多次了,只需在文本框的下拉列表之间进行选择。如果在文本框中输入了数据,那么我首先将数据插入数据库,然后使用 IDENTITY 获取插入行的唯一标识符以供进一步查询。

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

虽然这是针对 MS SQL 2008 的,但我不确定 @@SCOPE_IDENTITY() 全局是否存在于其他版本的 SQL 中,但我确信有等价物。

于 2009-01-02T11:39:52.553 回答