问题标签 [composite-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 - 数据库设计:复合键与一列主键
我正在处理的一个 Web 应用程序遇到了一个意外的“错误”——该应用程序的数据库有两个表(以及许多其他表),分别称为“States”和“Cities”。
' States ' 表字段:
' idStates ' 是一个自动递增的主键。
“城市”表字段:
' idAreaCode ' 是一个主键,由国家代码 + 区号组成(例如 91422,其中 91 是印度的国家代码,422 是印度城市的区号)。“ idStates ”是从“ States ”表派生的外键,用于将“ Cities ”表中的每个城市与其对应的州相关联。
我们认为国家代码+地区代码组合对于每个城市都是唯一的,因此可以安全地用作主键。一切正常。但是印度的一个地方在 db 设计中发现了一个意想不到的“缺陷”——印度和美国一样是联邦民主国家,在地理上分为许多州或联邦领土。州和联邦领土数据都存储在“州”表中。然而,有一个地方——昌迪加尔——属于两个州(哈里亚纳邦和旁遮普邦),它本身也是一个联邦领土。
显然,当前的 db 设计不允许我们存储多个城市“ Chandigarh ”的记录。
建议的解决方案之一是创建一个组合列“ idAreaCode ”和“ idStates ”的主键。
我想知道这是否是最好的解决方案?
(仅供参考:我们正在使用带有 InnoDB 引擎的 MySQL)。
更多信息:
- 该数据库存储每个城市的气象信息。因此,州和城市是每个查询的起点。
- 每天使用 CSV 文件插入每个城市的新数据。CSV 文件包括用于标识每条记录的 idStates(用于州)和 idAreaCode(用于城市)列。
- 数据库规范化对我们很重要。
注意:没有为 city 表使用自动递增主键的原因是数据库每天/每小时使用 CSV 文件(由另一个应用程序生成)更新。并且 CSV 文件中的每条记录都由 idStates 和 idAreaCode 列标识。因此,即使表被删除并再次刷新,城市表中使用的主键对于每个城市都是相同的。邮政编码(或 PIN 码)和区号(或 STD 代码)符合唯一、静态(不经常更改)的标准,并且这些现成的列表很容易获得。(我们现在决定使用区号,因为印度正在将其密码更新为新格式)。
我们决定的解决方案是在应用程序级别处理此问题,而不是更改数据库设计。在数据库中,我们将只存储“Chandigarh”的一条记录。在应用程序中,我们为任何搜索“Chandigarh, Punjab”或“Chandigarh, Haryana”创建了一个标志,以将搜索重定向到该记录。是的,这并不理想,但这是一个可以接受的折衷方案,因为这是迄今为止我们遇到的唯一例外。
sql - Postgres:如何做复合键?
我无法理解创建复合键时的语法错误。可能是逻辑错误,因为我测试过很多品种。
你如何在 Postgres 中创建复合键?
nhibernate - nHibernate 复合键类类型不匹配
我有一个带有复合键的旧表,它映射到其他 3 个表,因为该表中还有其他属性,因为它不是一个简单的映射表,所以我不能使用多对多集合解决方案来映射这个.
以下是我所做的:
AKey 只是一个包含三个 id 的结构体,Id_one、Id_two 和 Id_three 在各自的类中都定义为 int。
这编译得很好,但是当我尝试运行它时,它给了我一条错误消息:
NHibernate.QueryException:NHibernate.Criterion.SimpleExpression 中的类型不匹配:ID 预期类型 AKey,实际类型 System.Int32
请告知我做错了什么或错过了什么。
非常感谢!
sql - 自引用表上的复合键
对于下面定义的站点表,我们有一个复合主键。从功能上讲,这完全符合我们的意愿。每个站点都应该有一个同区的父站点。以这种方式定义表专门允许这样做。
我的具体问题是关于在复合 PK 上定义的自引用 FK。我听说过一些关于这种特殊设计的意见,它们往往相互矛盾。有些人特别喜欢它,因为它在对复合键的一般理解范围内发挥应有的作用。其他人坚持认为它在理论上是不正确的,并且应该在 FK 中包含一个 [partner_district_id] 字段而不是 [district_id]。这种设计需要验证以强制执行 [district_id] = [partner_district_id],这可以通过检查约束或应用程序级逻辑来完成。
对这些解决方案或任何其他解决方案的进一步意见将不胜感激。
mysql - MySQL 中的复合主键性能缺陷
我们有一个包含三个字段的复合主键的表(它在 MySQL 5.1 中)。该表每秒有近 200 次插入和 200 次选择,表的大小约为 100 万行,并且还在增加。
我的问题是:“复合主键”是否会降低该表上插入和选择的性能?
我应该使用简单的自动递增 INT ID 字段而不是复合主键吗?(我认为答案与 MySQL 处理多列索引的方式非常相关)
.net - 是否可以在流利的 nhibernate 中映射复合键,其中一半的键是数据库中的标识字段?
正如问题所述,是否可以在流利的 nhibernate(或我想的非流利的)中映射复合键,其中复合中使用的两个字段之一是身份字段?
我有一个表,其中主键的一部分是身份字段,另一部分是租户 ID。这是一个遗留数据库,其中复合键被用作外键,因此修改数据库将非常重要。
谢谢!
c# - 是否有一个 Linq 操作来确定集合中是否存在对一对属性具有相同值的项目?
C#:我有一个对象集合。T 有 2 个属性。属性 A 和属性 B。此集合需要遵守的规则是 A 和 B 的值组合在集合中必须是唯一的。换句话说,A 和 B 需要作为一个复合主键。
我可以使用 Linq 中的操作来检查这种情况吗?我希望它会像
上面的语句是我如何检查集合中是否有具有重复名称的项目,但我不知道如何为多个属性执行此操作。
sql - 代理键作为复合键的外键
我意识到可能会有类似的问题,但我找不到足够接近指导的问题。
鉴于此规范,
我提议的设计/实现是
这有什么问题吗?在这里可以将 SeriesID 代理作为外键吗?我不确定我是否遗漏了任何可能出现的明显问题。还是使用复合自然键(SiteID+SeriesCode / SiteID+EpisodeCode)会更好?从本质上讲,这会将 Episode 表与 Series 表分离,这不适合我。
值得补充的是,在将填充这些表的原始输入数据中,SeriesCode 看起来像“ABCD-1”,而 EpisodeCode 看起来像“ABCD-1NMO9”,所以我想这是可以改变的另一件事。
*:“虚拟”外键,因为之前上级已经决定我们不应该使用实际的外键
inheritance - Fluent NHibernate 从继承的复合 ID 映射复合 ID
假设我有一个包含以下 3 个表的现有数据库:
表 1:
(PK)T1ID1
(PK)T1ID2
表2:
(PK)T2ID1
表 3:
(FK)T1ID1
(FK)T1ID2
(FK)T2ID1(其中 3 个键来自上表)
我的问题是:如何使用 Fluent NHibernate 映射 Table3?
令我困惑的是如何处理它的复合键来自 2 个不同的表这一事实。
对于表 1 和表 2,我有以下映射:
tsql - 有没有一种简单的方法可以从两个整数复合键创建一个唯一的整数键?
由于与问题不太相关的各种原因,我有一个表,其中包含由两个整数组成的复合键,我想从这两个数字中创建一个唯一键。我最初的想法是把它们连接起来,但是当我意识到 (51,1) 的复合键会产生与 (5,11) 相同的唯一键,即 511 时,我很快遇到了问题。
有没有人有聪明的方法从两个整数中生成一个整数,使得生成的整数对于一对起始整数是唯一的?
编辑:在面对大量数学之后,我意识到我应该包括的一个细节是相关键的大小。在原始对中,第一个密钥当前为 6 位,并且可能在系统生命周期内保持 7 位;第二个密钥尚未超过 20。鉴于这些限制,看起来问题不那么令人生畏了。