create table PRIMES
(
PRIME_ID NUMBER not null,
PART_ORDER NUMBER(20) not null,
PRIME_PART_VALUE NUMBER not null
);
alter table PRIMES
add constraint PRIMES_PK primary key (PRIME_ID, PART_ORDER) using index;
例如,上面插入(例如1647):
insert into primes(PRIME_ID, PART_ORDER, PRIME_PART_VALUE) values (1647, 0, 81);
insert into primes(PRIME_ID, PART_ORDER, PRIME_PART_VALUE) values (1647, 1, 17);
insert into primes(PRIME_ID, PART_ORDER, PRIME_PART_VALUE) values (1647, 2, 83);
insert into primes(PRIME_ID, PART_ORDER, PRIME_PART_VALUE) values (1647, 3, 82);
prime_id值可以从oracle序列中分配...
create sequence seq_primes start with 1 increment by 1;
获取要插入的下一个素数的ID:
select seq_primes.nextval from dual;
选择具有指定ID的素数内容:
select PART_ORDER, PRIME_PART_VALUE
from primes where prime_id = 1647
order by part_order
9 回答
如果你真的想把素数存储为数字和一个问题,那么阻止你是“素数不能分解成因子”,还有另一件事:将它存储在按序列排序的任何数字的模数列表中 .
小例子:
清单是:
在实际应用中,有用的是按模数2 ^ 32(32位整数)进行分割,特别是当处理应用程序中的素数存储为字节数组时 .
存储在DB中:
例如,上面插入(例如1647):
prime_id值可以从oracle序列中分配...
获取要插入的下一个素数的ID:
选择具有指定ID的素数内容:
您可以将它们存储为二进制数据 . 它们不会直接从数据库中读取,但这应该不是问题 .
数据库(取决于哪些数据库)可以例行地准确存储高达38-39位的数字 . 这让你合情合理 .
除此之外,您不会(准确地)在数据库中对它们进行算术运算(除非您的特定数据库可能存在任意精度模块) . 但是数字可以存储为几千位的文本 . 除此之外,您可以使用CLOB类型字段来存储数百万个数字 .
此外,如果您存储素数序列并且您对该序列的空间压缩感兴趣,则可以从存储一个数字与下一个数字之间的差异而不是整数来开始,这是没有 Value 的 .
这有点低效,但您可以将它们存储为字符串 .
如果您不打算对这些数字使用数据库端计算,只需将它们存储为二进制表示的位序列(
BLOB
,VARBINARY
等)这是我2美分的 Value . 如果要将它们作为数字存储在数据库中,那么您将受到数据库可以处理的最大整数大小的限制 . 您可能需要一个2列表,其中一个列中的素数和另一列中的序号 . 然后,您需要一些索引来快速查找存储的值 .
但你真的不想这样做,你想要存储超出任何整数数据类型的humongous(sp?)素数方式 . 而且你说你反对字符串所以它是你的二进制数据 . (也适合我 . )是的,您可以将它们存储在数据库中的BLOB中,但是DBMS会为您提供哪种设施来查找第n个素数或检查候选整数的优先级?
如何设计合适的文件结构?这是我在约5分钟后想出的最好的想法:
将计数器设置为2 .
写入代表第一个素数的两位 .
再次写入它们,以标记包含2位素数的部分的结尾 .
将计数器设置为计数器1
按顺序写入3位素数 . (我认为有两个:5和7)
再次写入最后一个3位素数以标记包含3位素数的部分的结尾 .
回到4并经过必要的修改后继续进行 .
关于编写最后一个n位素数两次的观点是,当你来读取文件时,为你提供一种方法来识别文件中有n位素数的部分的结尾 .
在编写文件时,您可能还需要记录各个点的文件偏移量,也许是包含n位素数的每个部分的开头 .
我认为这会起作用,它会处理最多2 ^(你可以表示的最大无符号整数)的素数 . 我想很容易找到将325467位(比方说)值转换为大整数的代码 .
当然,你可以将这个文件存储为BLOB,但我不确定你为什么这么做烦 .
这一切都取决于你想用数字做什么样的操作 . 如果只是存储和查找,那么只需使用字符串并使用检查约束/域数据类型来强制它们是数字 . 如果你想要更多的控制,那么PostgreSQL将让你定义custom datatypes和函数 . 例如,您可以与GMP库接口,以便对任意精度整数进行正确排序和算术运算 . 使用这样的库甚至可以让你实现一个检查约束,它使用概率素性测试来检查数字是否真的是素数 .
真正的问题实际上是关系数据库是否是正确的工具 .
我认为你最好使用BLOB . 数据如何存储在BLOB中取决于您对数字的预期用途 . 如果你想在计算中使用它们,我认为你需要创建一个类或类型来将值存储为各种有序二进制值,并允许它们被视为数字等 . 如果你只需要显示它们那么将它们存储为一系列字符就足够了,并且不需要将可计算值转换为可显示的值,这对于大值来说可能非常耗时 .
分享和享受 .
可能并不精彩,但如果将它们存储在一些递归数据结构中会怎样 . 您可以将其存储为int,它是指数,以及对较低位数的引用 .
就像字符串的想法一样,它可能对内存考虑不太好 . 由于查询的递归性质,查询时间会增加 .