我应该为唯一名称表中的每一行提供行ID吗?

时间:2012-12-02 13:26:03

标签: mysql database

我需要一些最佳实践和表现建议。

假设我有三个表:员工,工作和排名。 每个员工都有工作和职级,所以显然我应该在Employees表中引用这些表。

我的问题是,哪种选择最好:

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

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而不是一个JOIN语句执行SELECT,我必须要处理的表现

我希望能够处理大量流量 - 具体而言,员工要求查看他们的工作和排名。

<的修改>

示例:

选项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 |
\___________/

2 个答案:

答案 0 :(得分:1)

是的,始终为每一行提供唯一的ID。

最佳实践,每张桌子都有这个。 通常称为'id'或-table-name_id'

它应该没有商业价值。

许多“保证唯一”的记录后来发现需要或存在或重复记录,并且总是拥有唯一的主键在遇到/发现它时会有很大的帮助。

“独特”的一个例子......不是......如果一个系统有人的社会安全号码,他们应该是唯一的。然而,可能有人输入错误。然后当具有“错误输入”值的人出现并且他们的号码被绑定时...在允许/解析这将是非常有用的,所有行都有自己的id不是ssn并且没有商业价值除了识别行之外的其他所有。

独特记录是一个众所周知的问题。拥有所有记录的唯一ID是解决它的解决方案的一部分。

以上所有例外都是性能。我并不太关心几千条记录的连接速度,因为SQL数据库的设计速度非常快。我发现了独特识别的优点,超重的缺点。在某些情况下,由于性能要求,您可能会更改上述做法。例如,如果有数百万条记录必须加载到内存中,则唯一ID空间的开销可能会成为一个问题。通常情况下,如果这些案例人们开始关注像Redis,MongoDB等的无sql解决方案那么

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

What's the best practice for primary keys in tables?

in general, should every table in a database have an identity field to use as a PK?

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

is an ID column really needed in SQL?

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

答案 1 :(得分:0)

我强烈建议您添加EMPL_ID(EmployeeID)。目前你的应用程序可以完美地运行,但是当你扩展它时,即使你认为你不会这样做,EMPL_ID也会派上用场。

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

例如,如果添加了tblNotes表。 (我不知道你的申请范围,所以我只想参考这个讨论的注释表)

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

如果不添加EMPL_ID,您将需要额外的列,这些列是不必要的,很可能在多个表中!

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

我总是在每个表中添加一个ID,因为它可以让生活变得更加轻松,特别是当您的应用程序增长时。此外,我甚至在某些情况下看到该公司有两名同名员工!当然,他们不太可能拥有相同的职位和工作,但这只是值得思考的问题!

我希望我能正确理解你的问题并给你一些有用的信息。

约翰