你是如何代表的;“辅助键”;在SQL中

你是如何代表的;“辅助键”;在SQL中,sql,Sql,我有一个要与某些所有者ID相关的数据列表,但该列表可能超出行大小限制,因此我希望将此列表拆分为多行。此列表中的每个条目都有自己的id,每个所有者都是唯一的。我正在查看复合键(ownerId:entryId),但我需要的主要操作是批量读取此数据(读取ownerId的所有条目)。构建这些数据的最佳方式是什么 例如: ownerId | entryId | data --------|---------|-------- OwnerA | 1 | aaaaa OwnerA | 2

我有一个要与某些
所有者ID
相关的数据列表,但该列表可能超出行大小限制,因此我希望将此列表拆分为多行。此列表中的每个条目都有自己的id,每个所有者都是唯一的。我正在查看复合键(
ownerId:entryId
),但我需要的主要操作是批量读取此数据(读取
ownerId
的所有条目)。构建这些数据的最佳方式是什么

例如:

ownerId | entryId | data
--------|---------|--------
OwnerA  | 1       | aaaaa
OwnerA  | 2       | bbbbb
OwnerB  | 1       | ccccc

请注意,
ownerId
这里是一个SQL生成的id,
entryId
是一个外部设置的id。

您可能需要一个复合主键,即:

创建表t(
...
主键(ownerId,entryId)
);

还有一些单独的索引用于
owneId
,例如哈希索引可能是一个很好的选择。

如果您知道查询的使用者将根据ownerId而不是entryId进行筛选(即表中绝大多数
WHERE
子句将根据ownerId而不是entityId进行筛选),然后,通过在
(ownerId,entryId)
上创建一个复合聚集键/索引,您可以简单地获得显著的里程数。我这样说是因为关系索引使用第一列作为主要排序标准,因此只要您基于
ownerId
进行筛选,就可以在后台使用
INDEX UNIQUE SCAN
操作检索行,而不是使用
TABLE FULL SCAN
操作

这就是说,如果您必须独立地对
ownerId
entityId
进行过滤(即,您将有几个查询,其中
WHERE
子句的格式为
WHERE ownerId={specific\u owner\u id}和其他几个查询,其中<代码>其中子句的格式为“代码> >“EntIdID= { TrimeIn TythyId} /Case>”,您可能需要考虑< <代码>主键< /代码> />代码>聚集索引< /代码> <代码>(OntrueID,EntIyID)< /C> >和“<代码>(EntIdID,HONERID)< /C> >:

上的唯一索引。 如果这样做,则对
ownerId
entityId
进行过滤的两个查询都可以利用
索引扫描操作

也就是说,如果表
t

用于
读取
操作的次数比用于
写入
操作的次数多。如果表的
写入
量更大,那么修改每个索引所花费的时间可能会超过更高效的查询读取所带来的好处。

我认为第一个选项适用于我的用例,因为我只需要存储就可以了如果不是因为大小限制,这些条目在一行中。我想从技术上讲,排序如何工作并不重要,但有趣的是,排序发生在第一列,而不一定是主键。
  CREATE TABLE t (
    ownerId INT NOT NULL,
    entityId INT NOT NULL,
    /*
    ...all other values ...
    */
    CONSTRAINT PK_t PRIMARY KEY (ownerId, entityId)
  );
  CREATE UNIQUE INDEX t_entity_owner ON t (entityId, ownerId);