1

我需要创建一个数据库设计,其中栏或事件所有者(管理表,因为他们拥有配置文件)向用户发送警报。

我想创建一个“ALERT”表,但很难决定使用什么主键。我想添加一个至少包含 admin_ID (PFK)、user_ID (PFK) 的复合键,并且我想将日期和时间戳添加到主键以指示管理员可以发送许多警报(通知),但只有 1 个某个时间点。
但是,从这个线程:时间戳作为复合主键的一部分?,我了解到我不应该使用时间戳。
顺便说一句,目前还没有决定我们将使用什么数据库软件。

我有时倾向于快速移动到自动增量键。我从来没有注意到这个问题(在 Access 中),但是从我读到的内容来看,这可能并不总是最有意义的事情,因此我向专业人士提出了这个问题。
我只有一次机会以正确的方式做到这一点,以使后端从根本上正确。
您对此有何看法?

4

3 回答 3

7

你会在 PK 使用什么的问题上引起很多激烈的争论。纯粹主义者会告诉您,您永远不应该使用自动增量键(假设 SQL SERVER)。曾经在真实战壕中的人会告诉您,他们作为 PK 非常好(在大多数情况下)并且具有一些真正的优势。

我不会试图以一种或另一种方式说服你。但我会告诉你我的经历。我已经开发软件 25 年了,并且大部分时间都在使用 RDBMS(主要是 SQL Server)。就个人而言,我发现自动增量 PK 非常宝贵,而且 99.99% 的时间不会考虑使用其他任何东西。为什么?

  1. SQL Server 会生成它们,因此会处理所有并发问题。
  2. 它们体积小,因此对这些键的查找非常快。
  3. 您可以通过 Id 值轻松引用表中的特定行。这听起来可能没什么大不了的,但它肯定会派上用场。例如,我无法告诉您有多少次我让合作开发人员查看表中键值为 12345 的行。这很简单,但非常有用。
  4. 在表中引用 PK 的 FK 将是相同的类型,因此也小而快,并且易于使用。
  5. 索引碎片很少或没有碎片,特别是如果 PK 是聚集索引(在 SQL Server 中)。

这种PK可能有一个很大的缺点。如果您必须将行从一个数据库合并到另一个数据库,您可能会遇到 PK 值冲突。但是,也有一些方法可以解决这个问题。当然,自动增量值也没有真正的意义。但没关系。其目的是提供唯一性。

这是一个完美的解决方案。没有。其他人会不同意使用它们。但是,对于大多数高端和关键业务项目,它们对我来说效果很好。

于 2012-09-12T12:04:00.693 回答
0

您始终可以选择使用 UUID ( http://en.wikipedia.org/wiki/Universally_unique_identifier ) 作为数据库主键。

所有主要的编程语言都支持它,IMO 它是一种选择,尽管它可能不是最好的,因为它效率低下。

于 2012-09-12T12:04:11.780 回答
0
  • 复合主键本身没有问题
  • 如果 PK 的任何组件都可以为空,则会出现问题
  • ...例如当任何组件还充当另一个表(或“域”)的 FK 时
于 2012-09-12T12:23:47.023 回答