我需要一些最佳实践和表现建议。
假设我有三个表:员工,工作和排名。 每个员工都有工作和职级,所以显然我应该在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 |
\___________/
答案 0 :(得分:1)
最佳实践,每张桌子都有这个。 通常称为'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?
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,因为它可以让生活变得更加轻松,特别是当您的应用程序增长时。此外,我甚至在某些情况下看到该公司有两名同名员工!当然,他们不太可能拥有相同的职位和工作,但这只是值得思考的问题!
我希望我能正确理解你的问题并给你一些有用的信息。
约翰