Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何存储不可变、唯一、有序的列表?_Mysql_Sql_Sql Server_Database Design_Database Schema - Fatal编程技术网

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

Mysql 如何存储不可变、唯一、有序的列表?,mysql,sql,sql-server,database-design,database-schema,Mysql,Sql,Sql Server,Database Design,Database Schema,我有一个拥有数百万实例的实体。每个实例都必须引用一个有序的项目列表。列表必须是唯一的,因此不会多次存储列表。但一旦创建,列表和实体实例都是不可变的。将有比列表多得多的实体实例,数据库必须支持快速插入实体 那么,什么是一种高效、健壮的存储不可变的、唯一的、有序列表的方法呢 编辑:到目前为止,我考虑了以下方法: 1) 列表表格有以下列:因此,如果列表#5包含元素[10,20,30]表格将包含: 5 1 10 5 2 20 5 3 30 5 10 20

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

那么,什么是一种高效、健壮的存储不可变的唯一的有序列表的方法呢


编辑:到目前为止,我考虑了以下方法:

1)

列表
表格有以下列:
因此,如果列表#5包含元素
[10,20,30]
表格将包含:

5   1   10
5   2   20
5   3   30
    
5   10   20   30
实体表将有一个
item\u list\u id
列,该列引用
列表
表(它不是外键,因为
list\u id
不是
列表
表中的唯一列-可以通过添加另一个包含所有有效
list\u id
)

  • 这个解决方案使得插入有点棘手
  • 它还将强制列表唯一性的责任放在应用程序上,这并不重要
2)

列表
表中有以下列:
因此,如果列表#5包含元素
[10,20,30]
,则该表将包含:

5   1   10
5   2   20
5   3   30
    
5   10   20   30
实体表将有一个
item\u list\u id
列,该列引用
列表

  • 由于列表长度有限,此解决方案的健壮性较差(尽管这对我来说不是什么大问题,因为我的列表不太可能包含超过10或20个元素)
  • 这种方法对于查询来说非常可怕(“查找出现特定项的所有列表”必须指定每一列),而使用ORM进行映射则是一场噩梦
  • 插入新实体并不太糟糕,因为我的列表通常有4-5个条目,所以我可能可以索引前几列
  • 唯一性的实施仍在应用程序的手中
3)

使用解决方案#1,但将毫无意义的
list_id
替换为列表上以序列化形式出现的哈希(比如SHA-1)

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

    • 如果要避免重复列表,需要在触发器中使用关系除法


      到目前为止,您尝试过或考虑过什么?您使用的是mysql还是sql server?“这两种设计很快可能会有很大的不同。”SeanLange我已经为这个问题添加了一些可能的方法。关于服务器-我更喜欢不依赖某个特定产品的独特功能的产品,但如果我找到一个只适用于其中一个产品的可靠解决方案,我将使用该解决方案。遗憾的是,这是不可能的,因为方法3在您提供的两个数据库上都不容易工作。看,SHA 1对于一个大整数来说有点大。。。二进制字段不能是索引。因此,您最终会得到一个带有十六进制编码的varchar或是一些速度较慢的东西。一直以来都有妥协。我会使用解决方案1,并将实体id重新用作列表id。@TomTom你确定吗?我知道UUID有时保存为二进制(16)列,它们是表的主键。示例:这是事实,但您谈论的是一个复杂的结果集,而不仅仅是一个唯一的约束。如果您真的那么担心,请在insert触发器中添加对列表唯一性的检查,如果整个列表重复,则会引发错误。使用带有检查的插入程序应该足够imho,但触发器将确保这一点。