相关疑难解决方法(0)

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

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

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

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

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

问题:-)

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

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

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

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

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

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

sql database sql-server relational

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

用随机数替换序列

我想用我自己定制的id生成器替换我在postgresql数据库中用于id的一些序列.生成器将生成一个随机数,最后带有一个checkdigit.所以这:

SELECT nextval('customers')
Run Code Online (Sandbox Code Playgroud)

会被这样的东西取代:

SELECT get_new_rand_id('customer')
Run Code Online (Sandbox Code Playgroud)

然后该函数将返回一个数值,例如:[1-9][0-9]{9}最后一个数字是校验和.

我担心的是:

  1. 我如何使事物成为原子
  2. 我如何避免两次返回相同的id(这可以通过尝试将其插入具有唯一约束的列中来捕获,但是我认为它迟到了)
  3. 这根本不是一个好主意吗?

注1:我不想使用uuid,因为它要与客户沟通,10个数字比36个字符uuid更容易沟通.

注意2:该函数很少被调用,SELECT get_new_rand_id()但会在id-column上被指定为默认值而不是nextval().

编辑:好的,下面的讨论很好!以下是对原因的一些解释:

  1. 那么为什么我会用这种方式过度复杂呢?purpouse是隐藏客户的主键.

    我给每个新客户一个唯一的customerId(在db中生成序列号).由于我与客户沟通该号码,我的竞争对手监控我的业务是一项相当简单的任务(还有其他数字,例如发票nr和订单nr具有相同的属性).正是这种监控我想更加努力(注意:并非不可能,但更难).

  2. 为什么是校验位?

    在有任何关于隐藏序列号的讨论之前我添加了一个checkdigit到ordernr,因为在制作中的某些点有klumbsy手指,我的想法是这将是一个很好的做法,以保持在未来.

在阅读完讨论后,我当然可以看到我的方法不是解决问题的最佳方法,但我对如何解决它没有其他好处,所以请在这里帮助我.

  1. 我应该添加一个额外的列,我将我公开的ID放在客户面上,并将串口作为主键吗?
  2. 如何以健全有效的方式生成要公开的id?
  3. 是否必须使用checkdigit?

sql random postgresql

12
推荐指数
1
解决办法
5113
查看次数

我应该在新应用程序中使用 Postgres 的 bigserial 记录吗?

我正在开发一个将数据存储在 PostgreSQL 数据库中的新应用程序。其他数据类型是来自某些测量设备的仪表记录。每个客户可能有成百上千的这些设备,并且通常每天提供的记录很少。新记录通过简单地删除旧记录来替换旧记录,并作为具有新 ID 的新记录插入。我的公司不知道我们每天真正需要存储多少拥有多少测量设备和记录的客户。

由于这是一个新应用程序,我想请教您关于使用serialvs.bigserial作为仪表记录 ID 的建议。当前的 x64 CPU 等是否有任何明显的性能降级?ID 字段的存储应该增加 2 倍,对吗?为什么不使用任何明显的原因bigserial

谢谢!

java sql postgresql sqldatatypes

8
推荐指数
1
解决办法
6414
查看次数