如何存储不可变的,唯一的,有序的列表?

时间:2014-11-11 12:14:24

标签: mysql sql sql-server database-design database-schema

我有一个拥有数百万个实例的实体。每个实例都必须引用的有序列表。列表必须是唯一的,因此不会存储多个列表。但是一旦创建,列表和实体实例都是不可变的。实体实例远远超过列表,数据库必须支持快速插入实体

那么存储不可变唯一有序列表的插入效率,强大,存储方式是什么?


编辑:到目前为止,我已经考虑过这些方法:

1)

lists表包含以下列:<list_id> <order> <item>因此,如果列表#5包含元素[10,20,30],则表格将包含:

5   1   10
5   2   20
5   3   30

实体表将有一个引用item_list_id表的lists列(它不是外键,因为list_id不是lists表中的唯一列 - 这可以通过添加另一个包含单个列的表来解决,该列包含所有有效的list_ids )。

  • 此解决方案使插入有点棘手
  • 它还负责在应用程序上强制执行列表的唯一性,这不是很好。

2)

lists表包含以下列:<list_id> <item1> <item2> <item3> ... <itemN>因此,如果列表#5包含元素[10,20,30],则表格将包含:

5   10   20   30

实体表将有item_list_id列,引用lists表。

  • 由于列表长度有限,此解决方案不太健壮(尽管这对我来说不是一个大问题,因为我的列表很少包含超过10或20个元素)
  • 这种方法非常可怕(“查找特定项目出现的所有列表”必须指定每一列),以及使用ORM进行映射的噩梦。
  • 新实体的插入并不算太糟糕,因为我的列表通常是4-5项,所以我可以索引前几列。
  • 应用程序仍然掌握着唯一性的执行。

第3)

使用解决方案#1,但用序列化形式的列表中的散列(比如SHA-1)替换无意义的list_id

  • 这种方式更加严格地执行唯一性,因为列表将具有唯一的哈希值
  • 插入更简单,更快捷(?)
  • 数据完整性实施仍然掌握在应用程序中。