问题标签 [primary-key-design]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
735 浏览

sql - SQL Server 默认分配负 PK 值

在写论文时,我正在写关于 SQL 数据类型以及在设计数据库结构时如何明智地选择它们的部分。

我在某处读到,作为最佳实践,您不应该为 PK 分配负值。这导致了以下问题:

默认情况下,SQL Server 实例会为主键分配负值吗?我知道可以自己分配它们,但我想知道 SQL 服务器是否会默认分配它们,如果是,在哪些情况下?

0 投票
1 回答
814 浏览

indexing - 如何在 DynamoDB 中实现可扩展的无序集合?

我正在研究在 Amazon DynamoDB 之上实现可扩展的无序对象集合。到目前为止,已经考虑了以下选项:

  1. 使用 DynamoDB 文档数据类型(地图、列表)并使用文档路径来访问独立项目。这对于收集限制为 400KB 的数据有一个明显的缺点,这意味着可能有 1..10K 个对象,具体取决于它们的大小。不太明显的缺点是将新对象插入此类集合的成本将是巨大的:亚马逊指定将根据总项目大小扣除写入容量,而不仅仅是新添加的对象 - 因此约 400 个容量单位接近大小限制时插入 1KB 对象。那么考虑到这一点排除了吗?

  2. 使用复合主散列 + 范围键,其中主散列对于集合中的所有对象保持相同,范围键只是随机或原子计数器。明显的缺点是具有相同的哈希键会导致错误的键分布——当有大量对象的集合时基数很低。这意味着分区错误,并且存在规模问题,同一集合上的所有读/写都卡在一个分片上,受到 DynamoDB 分区每秒 3000 次读取/1000 次写入的限制。

  3. 使用带有二级哈希 + 范围键的全局二级索引,其中哈希键对于属于同一集合的所有对象保持相同,而范围键只是随机的或原子计数器。与上面类似,GSI 的分区变得很差,并且它将成为一个瓶颈,因为太多相同的哈希值会迅速耗尽所有预置容量到索引。我没有找到 GSI 是如何准确实现的,因此不确定它受低基数的影响有多严重。

问题是,我是否可以忍受 (2) 或 (3) 并遭受不理想的密钥分配,或者是否有另一种实现被忽视的集合的方式,或者我应该考虑研究另一个 nosql 数据库引擎。

0 投票
2 回答
231 浏览

sql - 用于行版本控制的 RDBMS 主键设计

我想用行版本控制为我的表设计主键。我的表包含 2 个主要字段:ID 和时间戳,以及一堆其他字段。对于唯一的“ID”,我想存储以前版本的记录。因此,我正在为表创建主键以作为 ID 和时间戳字段的组合。因此,要查看特定 ID 的所有版本,我可以给出,

要返回 ID 的最新版本,我可以使用

并获得第一个元素。我的问题是,考虑到 ID 字段是主键字段的一部分,这个查询是否会高效并在 O(1) 中运行,而不是扫描整个表以获取与相同 ID 匹配的所有条目?理想情况下,为了得到 O(1) 的结果,我应该提供整个主键。如果它确实需要进行整个表扫描,那么我还能如何设计我的主键以便我在 O(1) 中完成这个请求?

谢谢,斯里拉姆

0 投票
4 回答
2268 浏览

database-design - 使用自然键作为 DomainObject 的 ID 或 GUID + 自增领域驱动设计

我一直在阅读很多关于 DDD 的文章,并注意到大多数人在持久化到数据库时都使用 GUID 作为他们的 ID。他们说 GUID 可以很好地扩展,并且在可扩展性方面,自动递增 ID 是一个很大的禁忌。

我现在很困惑是使用GUID还是auto-increment.

基本上域是关于membership system (binary tree). (tracking of register members)

第一个要求是我们应该有一些可以在系统中唯一标识它们的东西(我们称之为Account No.7digit)。

然后 newMembers可以被另一个注册Member。我们称之为推荐。

现在我打算做的是将MemberIdGUID 类型作为 DomainObject Id,它用作将用于连接的主键、外键(在 Referral 上,referer_id 将是 GUID MemberId)。AccountNo将是一个自动增量列,或者它可能会通过 MAX() + 1 从存储库中获取。主要用于系统和链接中的搜索功能。

DomainObject 的 ID 是否应该对系统用户隐藏,因为它只是一个技术实现?

两者结合好吗?GUID 作为数据库中的 row_id(代理键)。和(自然键)的自动增量?

从构造函数中排除 是否可以,AccountNo因为无论如何它都会自动递增?是否需要强制执行不变量?那么从存储库中获取下一个 ID 是要走的路并包含AccountNo在构造函数中吗?

我是否应该坚持使用 Auto-Increment ID 而忘记 GUID,删除MemberId并让其AccountNo成为 DomainObject 的 ID?

笔记:

我不会建立某种下一个 Facebook。

我只想练习 DDD 的战术方面,以了解如何在了解其优点和缺点的情况下做出艰难的架构决策。

我只是想练习 DDD 的战略方面,以了解如何在了解其优点和缺点及其实施的情况下做出艰难的架构决策。

如果我们将使用会员注册制作 3 个场景:

  • 第一种情况:会员注册每分钟发生一次。
  • 第二种情况:会员注册每小时发生一次。
  • 第三种情况:会员注册每天最多发生 5 次。

它将如何影响决策?

技术栈:

  • ASP MVC 5
  • 数据库服务器 2014
  • C#
  • 简洁的 ORM
0 投票
1 回答
74 浏览

sql-server - SaaS 项目的表索引注意事项

很高兴听到你们讨论如何最好地考虑索引策略,因为这些表中的数据在未来可能会大幅增长。决定通过将多租户数据存储在单表方法中来进行。例如,我只有几个表用于此讨论。

  • MenuTypeName 对于每个租户应该是唯一的。因此,我将 在 TenantID 和 MenuTypeName 上有一个唯一索引
  • TenantID 应参考 Tenant 表。因此,TenantID 上的外键
  • 我仍在考虑是否应该在 MenuTypeID 上有主键或只是一个聚集索引,它是一个自动增量列。
  • 将来,当表大小增加时,我应该能够轻松地将基于 TenantID 的数据分区到新的数据库服务器。

问题:

  1. 我真的需要在 MenuTypeID 上定义主键吗,因为我们知道 SQL Server 保证增量种子。我可以在 MenuTypeID 上定义一个聚集索引吗?
  2. 在 TenantID 和 MenuTypeName 上定义唯一键。

使用这种方法,我在表设计中不会有主键的概念。但是,我想知道我将来是否会因为表中没有主键而招来麻烦?

0 投票
1 回答
535 浏览

sql-server - 在日期维度中使用自然键

我正在努力理解在日期维度表中具有自然键的概念。

我总是看到在维度表中创建了一个随机代理键。但我最近读到,与自然的自然代理键相比,在日期维度中使用自然键20150806Aug-06-2015效果要好得多,并且在从事实表进行查找和反向查找时具有相当大的性能提升int

我无法理解它将如何带来任何性能提升。join即使我们使用这个花哨的键作为日期维度,我们仍然需要在事实和维度之间。

如果有人对此有任何见解,请介意分享知识。如果你能跟进一个例子,我将不胜感激。

0 投票
2 回答
621 浏览

mysql - MySQL将主键从varchar移动到int

我在 MySQL (innodb) (X、Y 和 Z) 中有三个表。X是一张超过1000万行的表,主键Y为外键。类似地,Z 是超过 3000 万行的表,主键为 Y 作为外键。

现在的问题是 Y 的主键是 VARCHAR(类似于 md5 哈希或 GUID)。我想将此键移至 INT (AUTO_INCREMENT)。有什么方法可以在 mysql 中实现这一点,而无需用任何其他语言编写脚本?

此外,表 Z 的主键也是一个 VARCHAR (md5/GUID)。我也想将其更改为整数。(它不是任何表中的外键)。

0 投票
1 回答
898 浏览

python - SQLAlchemy sheme 允许两个表共享一个主键列

假设我有两张桌子,foo 和 bar。两者都有主键。我想在 SQLAlchemy 中设置它,以便 foo.id 和 bar.id 的组合是唯一的。我该怎么做?

我尝试添加另一个只包含主键并在 foo 和 bar 中有外键的表,如下所示:

但它给了我这个错误:

FlushError:实例具有 NULL 身份密钥。如果这是一个自动生成的值,请检查数据库表是否允许生成新的主键值,以及映射的 Column 对象是否配置为期望这些生成的值。还要确保此 flush() 不会在不适当的时间发生,例如在 load() 事件中。

对于我正在尝试做的事情,是否有更好的解决方案?

编辑:我正在使用 sqlite 数据库。

0 投票
1 回答
111 浏览

postgresql - 从其他列值自动生成列值并用作 PRIMARY KEY

我有一个表,其中有一列名为“source”和“id”。该表是从开放数据数据库中填充的。“id”不能是唯一的,因为我的数据来自其他具有自己的 id 系统的数据库。拥有相同的 id 但真正不同的数据确实存在风险。

我想创建另一列将源和 id 组合成一个值。

我见过使用 || 的例子 和连接值的功能。这很好,但我想让这第三列成为我的 PRIMARY KEY,以避免重复,并创建一个真正唯一的 id,我可以在没有太多计算的情况下进行查询,并且可以将其用作其他表的外键约束。

我认为复合类型是我正在寻找的,但不是每次手动设置值,我想通过仅设置“源”和“id”来自动获取它们

我对 postgresql 还很陌生,所以欢迎任何帮助。谢谢你。

0 投票
1 回答
29 浏览

number-formatting - 如何格式化数字数据类型的字段以允许其输入值保留小数点右侧一位非零数字?

我尝试使用通用数字或固定格式设置主键,并且我将小数点设置为 1 位......一旦我在表格中输入了一个数量(例如 101.1),只要我点击另一个字段上的指针,值改为 101.0!我希望输入后保留十进制值,而不是变成 101.0 而不是所需的 101.1。