【发布时间】:2017-08-10 03:28:35
【问题描述】:
在我的系统中,我有基于存储在数据库中的规则创建的临时实体,并且这些实体没有持久化。
现在,我需要存储关于这些实体的信息,因为它们是根据规则创建的并且没有存储,所以它们没有 ID。
我想出了一个公式来根据用于生成这些临时实体的规则为这些临时实体生成一个 ID:id = rule id + "-" + 规则中的实体索引。此公式生成 164-3、123-0、432-2 等形式的唯一字符串...
我的问题是当我的键没有关系或顺序时,我应该如何构建我的表(关于主键和聚集索引)?请记住,我只会(99.9% 的时间)使用上面提到的 id 查询表。
经过大量阅读后我想到的选项,但不知道哪个更好:
1) 具有聚集索引的 varchar 列上的主键。 -根据各种消息来源,由于碎片化和密钥的广泛性,这会很糟糕。此外,它们的排序格式也很奇怪。
2) 没有聚集索引(堆表)的 varchar 列上的主键。 - 由于索引和碎片问题,根据各种来源,这也是一个坏主意。
3) 具有聚集索引的标识 int 列,以及具有唯一索引的 varchar 列作为主键。 - 在这里看不到代理键的好处,因为它主要有助于范围查询和排序,我永远不会根据这个键查询表,因为它在任何时候都是未知的。
4) 2 列复合键:规则 ID + 规则索引列。 - 现在我没有字符串,但我有两列将被复制到 FK 和非聚集索引。另外我不确定在这种情况下我会使用什么索引。
任何人都可以在这里发光吗?任何帮助表示赞赏。
--编辑
我将执行比插入更多的选择;
我将执行比更新更多的插入;
所有选择将至少包含规则 ID;
如果我使用代理主键和 (rule id, index) 上的唯一索引,那么我可以在按规则 id 检索数据后使用代理进行后续操作,这样会更快。此外,插入会更快。 但是,因为数据将根据代理键存储,所以我可能有具有相同规则 id 但索引不同的记录,存储在磁盘上的距离很远,这意味着即使在规则 id 上有索引,检索数据可能有点慢。
如果我使用 (rule id, index) 作为聚集主键,具有相同规则 id 的行将彼此靠近存储,并且通过规则 id 选择数据将足够有效。但是,我怀疑插入会很慢。
上面的理由正确吗?
【问题讨论】:
标签: sql-server database-design