问题标签 [surrogate-key]
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.
mysql - 如何使用代理键执行更新查询
我对数据库概念非常陌生,目前正在学习如何设计数据库。我有一个包含以下列的表格...
这是在mysql中:
我不能选择上述任何列作为主键,因为它们将来可能会改变。所以我创建了一个自动增量 id 作为 names_id。我还有一个 GUI(一个 JTable),它显示这个表和用户更新 Result、issues_id 和基于 Names.Names 的评论这里是一个大文本列。我无法在 GUI 中显示 names_id,因为它在 GUI 中没有任何意义。现在,当用户在 GUI 中为 column2、3、4 提供输入后更新数据库时,我使用以下查询更新数据库,我无法在 where 子句中使用 names_id,因为 Jtable 的 row_id 与 names_id 不匹配,因为并非所有行被加载到 JTable 上。
我可以更新数据库,但我想知道是否可以在不使用 PK 的情况下更新数据库。这效率如何?代理键在这里有什么作用?
asp.net - 数据库设计与代理键有关系
首先,我希望能够更新所有属性/字段并且没有单个唯一键。我有一个层次结构,比如每台 PC 都可以归类为 PC1/PC2/PC3 无法举例,每台 PC 都有网络和软件信息。设计和示例是
Parent Table PC(EmpName, PCName, HostName,.... PhysicalLocation, PCType)
EMPName,PCName,PCType
结合使这张桌子独一无二。
示例记录('XYZ', 'Work Laptop','XYZ-PC',.....,'DESK-123','PC1')
子表PCNetwork(EmpName, PCName, HostName,IPAddr,....,PhysicalLocation,PCType)
example record1 ('XYZ', 'Work Laptop','XYZ-PC','0.0.0.0',....,'DESK-123','PC1')
example record2 ('XYZ', 'Work Laptop','XYZ-PC','0.0.0.1',....,'DESK-123','PC1')
由于我希望所有字段都是可修改的,因此我在两者中都添加了代理键 ID 列。我已将 PC-Id 用作网络表的 FK,但在插入时我必须编写一个查询以从 PC 表中获取 Id。
有两个问题,如果我使用自然/复合键,我不能对每条记录进行更新,因为更新是通过不允许主键更新的 Asp.Net Gridview 完成的。
如果我使用代理键,则可能会出现重复记录,并且我无法引用它们或将外键约束施加到其他字段,因为它们只有通过组合所有三个字段才能是唯一的。
我正在使用 SQL Server 2008 和 ASP.Net 4.0
我肯定错过了一些东西,任何人都可以为此提供帮助或建议一个好的设计。谢谢!!
mysql - 如何将主要属性从一个属性更改为另一个属性。mysql
我有一个数据库,我在其中声明了一个主键。后来在实现数据库时,我意识到我必须创建一个自动递增代理键并将我当前的主键切换到那个,因为我当前的主键不可避免地会出现多次。我已经探索了堆栈溢出的深度和其他寻找答案的网站,但我找不到合理的解决方案。
具体来说,我正在为兄弟会制作这个数据库,其中每个成员都以唯一的滚动编号启动。使用滚动编号作为主键似乎是一个好主意,直到我意识到拥有多个学习专业的成员将有两个元组(一个表示每个专业,数据库必须在 3NF 中)。考虑到这一点,创建代理键是可行的方法,还是有更合理的问题解决方案?
sql - 代理键“偏好”解释
据我了解,自然键的纯粹主义者和代理键的纯粹主义者之间正在进行一场战争。喜欢这篇文章(还有更多)的人说“自然键对你不好,总是使用代理......
但是,我要么是愚蠢的要么是盲目的,但我看不到总是拥有代理键的理由!
假设您在配置中有 3 个表,如下所示:
为什么我需要一个代理键呢?我的意思是没有它是完全有道理的。
另外,有人可以解释一下为什么主键永远不应该根据代理键纯粹主义者而改变吗?我的意思是,如果我说color_id VARCHAR(30)
并且 key is black
,并且我不再需要 black 因为我将其更改为charcoal
,那么为什么将black
key 更改为charcoal
以及所有引用列也是一个坏主意?
编辑:刚刚注意到我什至不需要更改它!只需创建一个新的,更改引用列(就像我对代理键所做的一样),然后让旧的保持平静......
在代理键咒语中,我需要然后创建额外的条目,比如id=232
和name=black
. 这对我有什么好处?我在桌子上有一把备用钥匙,我不再需要了。另外我需要加入以获得颜色名称,否则我可以留在一张桌子上并快乐吗?
请向 5 岁的孩子解释一下,请记住,我并不是要说“代理键不好”,我想理解为什么有人会说“总是使用代理键!”之类的话。
doctrine-orm - Doctrine2 中关系实体(也是关系的实体)上的复合主键或代理主键
我有一个大型数据库,其中有关系实体。这正是因为 Doctrine 2 手册中的以下注释:我需要在我们的关系中存储额外的属性,因此关系成为一个实体。
通常我们为实体使用生成的 id,为关系使用复合键。在这种情况下,实体是一种关系,因此选择有点复杂......
请注意,我在这里不是在谈论自然键。我正在使用一个复合键,它由 id 组成,这些 id 是在各自拥有的实体中使用自动增量策略创建的整数。
我看到在关系实体上使用复合主键的一些缺点:
- 我需要在创建实体及其关系之间调用persist(在我可以将它用作复合主键中的外键之前生成实体上的键)。
- 要将其他实体与关系实体相关联,我们需要在这些实体中再次为复合键中使用的 id 添加列。如果我要使用代理主键,我只需要一列来保存那个 id。
我还看到了使用复合键的一些优点,例如:
- 它们消除了对某些连接查询的需要,相反,您可以构建查询以使用复合键直接提取信息。
但目前使用复合键最重要的论点如下:
- 当 User 和 SomeEntity 之间的关系被删除并随后再次创建时(这种情况很可能发生在我们的应用程序模型中),我们也需要恢复对所有其他相关实体的访问。如果 User 和 SomeEntity 之间的关系是使用代理主键上的自动增量策略创建的。恢复的(新)关系将获得一个新的主键(id)。因此,相关实体(使用“旧”键存储)不再可访问。如果我在关系上使用复合键,我可以简单地恢复关系(它获得相同的复合键值)并且我可以立即再次访问其他相关实体。
有没有遇到过类似情况的人?是否有其他解决方案可以使其正常工作。我错过了任何重要的缺点或优点(使用 Doctrine ORM 时)。
我能想到的另一种选择是向 User SomeEntity 关系添加一个状态。我们可以将状态更改为禁用、启用,而不是删除条目。通过这种方式,我们可以使用代理键而不是复合键,因为该条目永远不会被删除......
非常感谢您的反馈...
对于感兴趣的人,这里还对 Stack Overflow 上的代理键与复合键进行了很好的讨论:(单击)
mysql - 当我确定主键是并且永远是唯一的时,它是否应该自动递增?
一段时间以来,我一直在寻找一个令人满意的答案,对我的特定问题更具体一些,但还是有用的。我是否只是没有看正确的地方,我不知道,但这里有:
我正在从应用程序中提取数据,然后对其进行操作并发送到我自己的服务器。在提取的数据中,最初在应用程序的数据库中是一个自动递增的标识符。我刚才检索到的这个标识符的一个例子是955534861。不自动增加我的主键并且只使用我知道并且将始终保持唯一的值不是更好更有效的设计,还是我应该研究诸如代理键之类的概念?
提前致谢。
foreign-keys - 数据集市中的代理键
我有三个事实表的 32 个维度,我目前正在使用 SQL Server 2012!
由于 SQL Server 的外键限制为每个索引 16 个,这是否意味着我必须使用代理键来索引事实表中的数据?!或者这个问题还有其他解决方案吗?
由于我的 ETL 每月执行一次,我是否应该在每次数据泵之前检查我插入的数据(外键连接)不存在?!
如果我决定使用代理键并且当我使用蒙德里安立方体(pentaho)时,工作方式(创建模式)是相同的还是与正常方式不同?
谢谢你。
ssis - 查找代理键和填充事实表
我有 8个代理键,我需要在维度表上查找并填充事实表。我为维度表创建了8 个查找,然后使用合并连接和排序组件将数据合并到一个结果集以插入到维度表中。我担心的是在我进行插入之前会发生很多合并和排序,并且性能不好。实现我上面解释的最佳方法是什么?
mysql - 关于使用电子邮件地址作为主键的思考
使用电子邮件地址作为主键的做法是什么?我应该避免它并使用自动递增的 ID 号,还是引擎也能够处理它?
MySQL 数据库,但我对其他引擎如何处理这个感兴趣(特别是 PostgreSQL)。
etl - 使用代理键(和 SCD)导入 DWH
我有一个数据仓库,它使用内部代理键和类型 2 缓慢变化的维度。在清算中,我们只有来自 erp 系统的业务密钥,如下所示:
在数据仓库中,我们希望使用代理键(注意:文章价格从 500 美元更改为 1000 美元,并且文章尽可能使用代理键,此处仅适用于制造商)。
如果我们只是使用业务密钥没问题,只需比较、更新旧条目、插入新条目。但是使用代理键的最佳方法是什么?
从清算中的数据仓库获取现有 ID(0 或 -1 表示尚不存在),然后比较条目?
将业务密钥也保存在数据仓库中,比较它们并更新 Ids 然后在数据仓库中?