相关疑难解决方法(0)

表中主键的最佳实践是什么?

在设计表时,我养成了一个习惯,就是让一个列是唯一的,并且我制作了主键.这取决于要求以三种方式实现:

  1. 自动递增的标识整数列.
  2. 唯一标识符(GUID)
  3. 可用作行标识符列的短字符(x)或整数(或其他相对较小的数字类型)列

数字3将用于相当小的查找,主要是可能具有唯一静态长度字符串代码的读取表,或者诸如年份或其他数字的数字值.

在大多数情况下,所有其他表将具有自动递增整数或唯一标识符主键.

问题:-)

我最近开始使用没有一致行标识符的数据库,主键目前在各个列上进行聚类.一些例子:

  • 日期时间/字符
  • 日期时间/整数
  • 日期时间/ VARCHAR
  • 炭/ NVARCHAR/nvarchar的

这有一个有效的案例吗?我总是会为这些案例定义一个标识或唯一标识符列.

此外,还有许多表没有主键.这有什么正当理由?

我试图理解为什么桌子的设计原样,对我来说这似乎是一个很大的混乱,但也许有充分的理由.

第三个问题可以帮助我解释答案:在使用多列构成复合主键的情况下,这种方法与代理/人工密钥相比有特定的优势吗?我主要考虑的是性能,维护,管理等方面?

sql database sql-server relational

245
推荐指数
11
解决办法
15万
查看次数

什么是最常见的SQL反模式?

我们所有使用关系数据库的人都已经学习(或正在学习)SQL是不同的.引出期望的结果,并且有效地进行,涉及一个繁琐的过程,其部分特征是学习不熟悉的范例,并发现我们最熟悉的一些编程模式在这里不起作用.您见过(或自己承诺)的常见反模式有哪些?

sql anti-patterns

226
推荐指数
28
解决办法
7万
查看次数

代理与自然/商业密钥

我们再来一次,旧的论点仍然出现......

我们是否更好地将业务密钥作为主键,或者我们是否更愿意在业务键字段上具有唯一约束的代理ID(即SQL Server标识)?

请提供支持您的理论的示例或证明.

database database-design key primary-key

166
推荐指数
13
解决办法
6万
查看次数

外键在数据库设计中是否真的必要?

据我所知,外键(FK)用于帮助程序员以正确的方式操作数据.假设程序员实际上已经以正确的方式执行此操作,那么我们真的需要外键的概念吗?

外键还有其他用途吗?我在这里错过了什么吗?

database oracle foreign-keys

104
推荐指数
14
解决办法
3万
查看次数

什么是规范化(或规范化)?

为什么数据库人员继续关于规范化?

它是什么?它有什么用?

它适用于数据库之外的任何内容吗?

database-design relational normalization

102
推荐指数
5
解决办法
6万
查看次数

你觉得你的主键怎么样?

在我的团队的一个相当生气勃勃的讨论中,我被认为是大多数人喜欢的主键.我们有以下小组 -

  1. Int/BigInt哪个自动增量是足够好的主键.
  2. 应该至少有3列构成主键.
  3. Id,GUID和人类可读行标识符都应该区别对待.

什么是PK的最佳方法?如果你可以证明你的意见,这将是很棒的.上面有没有更好的方法?

编辑:任何人都有一个简单的样本/算法来生成可扩展的行的人类可读标识符?

algorithm ddl database-design primary-key relational-database

85
推荐指数
11
解决办法
2万
查看次数

选择满足不同行的不同条件的值?

这是一个我无法弄清楚的非常基本的查询....

假设我有一个像这样的两列表:

userid  |  roleid
--------|--------
   1    |    1
   1    |    2
   1    |    3
   2    |    1
Run Code Online (Sandbox Code Playgroud)

我想得到所有具有roleids1,2和3的不同用户ID .使用上面的例子,我想要返回的唯一结果是userid1.我该怎么做?

mysql sql relational-division sql-match-all

29
推荐指数
3
解决办法
1万
查看次数

选择最好的主键+编号系统

我们正在努力为我们正在创建的资产系统提出一个编号系统,在办公室里对这个主题进行了一些激烈的讨论,所以我决定向SO的专家们询问.

考虑到下面的数据库设计,什么是更好的选择.

替代文字

示例1:使用自动代理键.

=================   ==================
Road_Number(PK)     Segment_Number(PK)
=================   ==================
 1                   1
Run Code Online (Sandbox Code Playgroud)

例2:使用程序生成的PK

=================   ==================
Road_Number(PK)     Segment_Number(PK)
=================   ==================
 "RD00000001WCK"     "00000001.1"
Run Code Online (Sandbox Code Playgroud)

(该00000001.1指它的第一个道路段,这增加了每次你添加一个新的细分如00000001.2)

示例3:使用两者(添加新列)

=======================    ==========================
ID(PK) Road_Number(UK)     ID(PK)  Segment_Number(UK)
=======================    ==========================
 1     "RD00000001WCK"       1       "00000001.1"
Run Code Online (Sandbox Code Playgroud)

只是一些背景信息,我们将使用Road NumberSegment Number报告和其他文档,因此它们必须是唯一的.

我总是喜欢保持简单,所以我更喜欢示例1,但我一直在阅读,你不应该在报告/文档中公开你的主键.所以现在我更多地考虑示例3.

我也倾向于示例3,因为如果我们决定更改资产编号的生成方式,则不必对主键进行级联更新.

您认为我们应该怎么做?

谢谢.

编辑:谢谢大家的好评,给了我很多帮助.

database database-design primary-key

23
推荐指数
3
解决办法
9605
查看次数

如果我总是用PHP控制我的数据库输入,那么NOT NULL和FOREIGN KEY之类的约束有多重要?

我试图在一个外键的表中创建一个列,但在MySQL中,它比它应该更难.它需要我返回并对已经使用的表进行某些更改.所以我想知道,MySQL有必要确保某个值合适吗?我不能只是做与像PHP语言,其中我使用到访问该数据库

与NOT NULL类似.如果我只用PHP访问这个数据库,我不能简单地让PHP确保没有输入空值吗?

当我可以使用PHP时,为什么我应该使用MySQL来强制执行这些约束?


我意识到由于上述原因,NOT NULL是一个非常愚蠢的部分.但是,如果没有严重的编程,MySQL就不会强制执行外键.

在您看来,使用"假"外键仍然是不好的,只需检查输入的值是否与其他表匹配,使用PHP?

php mysql constraints

22
推荐指数
3
解决办法
6057
查看次数

规范化需要多长时间?

我有这些表:

Projects(projectID, CreatedByID)
Employees(empID,depID)
Departments(depID,OfficeID)
Offices(officeID)
Run Code Online (Sandbox Code Playgroud)

CreatedByID是一个外键Employees.我有一个几乎每个页面加载运行的查询.

添加冗余OfficeIDProjects以消除三个连接是不好的做法吗?或者我应该做以下事情:

SELECT * 
FROM Projects P
JOIN Employees E   ON P.CreatedBY = E.EmpID
JOIN Departments D ON E.DepID = D.DepID
JOIN Offices O     ON D.officeID = O.officeID
WHERE O.officeID = @SomeOfficeID
Run Code Online (Sandbox Code Playgroud)

在应用程序编程中,我"首先编写最佳实践并在之后进行优化",但数据库管理员始终警告连接的成本.

sql database-design database-normalization

20
推荐指数
5
解决办法
6182
查看次数