1

我需要一些最佳实践和性能建议。

假设我有三个表:Employees、Jobs 和 Ranks。每个员工都有一份工作和一个等级,所以很明显我应该在我的员工表中引用这些表。

我的问题是,这些选项中哪个是最好的:

1) 每个职位和等级都存储有一个唯一的 ID,并与描述性名称配对。Employees 表应该引用另一个表中的唯一 ID,从而节省内存(描述性名称仅在 Jobs/Ranks 表中保存一次),但要查看描述性名称,我需要这样做JOIN

SELECT Employees.EMPL_ID, Ranks.R_NAME, Jobs.J_NAME
FROM Jobs
JOIN Ranks ON Ranks.R_ID=Employees.RANK
JOIN Jobs ON Jobs.J_ID=Employees.JOB

2) 只是唯一的描述性名称。这可能会浪费内存,因为我反复保存每个职级/工作的描述性名称,但我节省了我的SELECT陈述时间

<编辑: >

澄清一下,我主要关心的是如果我需要SELECT用多个JOINs 而不是一个SELECT语句执行 s,我必须处理的性能。

我希望能够处理大量流量 - 特别是员工请求查看他们的工作和排名。

<编辑>

例子:

选项 1(ID 和名称):

Employees:
 __________________________
/ EMPL_ID  |  RANK  | JOB  \
|    1     |    2   |  3   |
|    1     |    1   |  3   |
|    1     |    1   |  1   |
\__________|________|______/

Ranks:
 __________________
/  R_ID  |  R_NAME \
|    1   |   GRUNT |
|    2   |   BOSS  |
\________|_________/

Jobs:
 ____________________
/  J_ID  |  J_NAME   \
|   1    | JANITOR   |
|   3    | PRESIDENT |
\________|___________/

选项 2(唯一名称):

Employees:
 _______________________________
/ EMPL_ID  |  RANK  | JOB       \
|    1     |  BOSS  | PRESIDENT |
|    1     |  GRUNT | PRESIDENT |
|    1     |  GRUNT | JANITOR   |
\__________|________|___________/

Ranks:
 __________
/   R_NAME \
|    GRUNT |
|    BOSS  |
\__________/

Jobs:
 ___________
/  J_NAME   \
| JANITOR   |
| PRESIDENT |
\___________/
4

2 回答 2

1

是的,总是给每一行一个唯一的 ID。

最佳实践是始终为每个表提供此信息。通常称为 'id' 或 the-table-name_id'

它应该没有商业价值。

许多“保证唯一”记录后来发现需要或存在或重复记录,并且始终拥有唯一的主键在满足/发现这一点时有很大帮助。

“唯一”的一个例子......那不是......如果一个系统有人们的社会安全号码,它们应该是唯一的。但是,有可能打错了。然后,当具有“错误输入”值的人出现并且他们的号码被输入时...除了识别行。

唯一记录是一个众所周知的问题。为所有记录提供唯一 ID 是解决该问题的解决方案的一部分。

上述所有情况的例外是性能。我不太关心几千条记录的连接速度,因为 SQL 数据库是为加快连接速度而设计的。我发现唯一标识的优势大于劣势。在某些情况下,您可能会因性能要求而更改上述做法。例如,如果必须将数百万条记录加载到内存中,则唯一 ID 空间的开销可能会成为一个问题。通常,如果人们开始关注 Redis、MongoDB 等 no-sql 解决方案,那么这些情况通常会发生。

以下是 SO 和其他网站上的一些其他参考资料:

表中主键的最佳做法是什么?

一般来说,数据库中的每个表都应该有一个身份字段用作 PK 吗?

http://www.sql-server-performance.com/forum/threads/do-i-need-a-unique-identifier-or-identity-column.16910/

SQL 中真的需要 ID 列吗?

正如在一个答案中评论的那样“在社区中的宗教辩论中使用自然键与代理键”。还有关于回答者如何获得他们的“规则”的评论...... tee-hee......

于 2012-12-02T13:27:38.960 回答
0

我强烈建议您添加一个 EMPL_ID (EmployeeID)。目前,您的应用程序可能工作得非常好,但是当您扩展它时,即使您认为自己不会这样做,EMPL_ID 也会派上用场。

不仅如此,如果您在代码中有可用的 EMPL_ID 并且需要访问您现在或将来构建的其他表,您所要做的就是将 EMPL_ID 添加到该表中,而不必复制两个 R_ID和新表中的 J_ID。

例如,如果您添加了一个 tblNotes 表。(我不知道您的应用程序的范围,因此我将仅参考注释表进行讨论)

在此示例中,您只需要以下列:noteID、EMPL_ID、note、noteDateTime...。

如果不添加 EMPL_ID,您将拥有多余的列,这些列是不必要的,而且很可能在多个表中!

此外,添加索引只能在一列上。

我总是为每个表添加一个 ID,因为它使生活变得如此轻松,尤其是当您的应用程序增长时。另外,我什至在某些情况下看到公司有两个同名的员工!当然,他们不太可能拥有相同的级别和工作,但这只是值得深思的!

我希望我正确理解了您的问题,并为您提供了一些有用的信息。

约翰

于 2012-12-02T13:44:11.783 回答