草庐IT

php - 奇怪的数据库设计,需要指导

coder 2023-06-11 原文

我可能在想这个问题,但这里是。

计算机开始在 11111111111111111111 和 99999999999999999999 之间连续吐出大量随机数:

  • 有时计算机会在行的一端添加一个数字。
  • 有时计算机会在线路的另一端添加一个数字。
  • 每个数字都有一个之前出现或即将出现的数字。
  • 每个数字后面都有一个数字,或将在其后。
  • 并非所有数字都是唯一的,很多(但不是大多数)是重复的。
  • 计算机永远不会停止吐出数字。

当我记录所有这些数字时,我需要能够在任何给定时间做出有根据的猜测:

  • 如果这是我第二次看到一个数字,我必须知道上次排在它前面的是什么数字。

  • 如果它出现了两次以上,我必须知道它前面数字的概率/频率。

  • 如果这是我第二次看到一个数字,我一定也知道上次排在它后面的是什么数字。

  • 如果它出现了两次以上,我必须知道它后面出现数字的概率/频率。


我到底要如何构建 MySQL 数据库中的表来存储所有这些数字?我使用哪种引擎,为什么?我如何制定我的查询?我需要快速了解,但容量也很重要,因为什么时候才会停止吐出它们?

我考虑不周的计划:

2 个表:

1. Unique ID/#
2. #/ID/#

我的想法:

唯一 ID 几乎总是比数字更短 = 更快匹配。 数字重复 = 更少的 ID 行 = 更快的初始匹配。

Select * in table2 where id=(select id in table1 where #=?)

或者:

3 表:

1. Unique ID/#
2. #/ID
3. ID/#

我的想法:

如果我只需要左/前,或者只需要后/右,我会缩小第二个查询的大小。

SELECT # IN table2(or 3) WHERE id=(SELECT id IN table1 WHERE #=?)

1 表:

1. #/#/#

想法:

更少的查询 = 更少的时间。

SELECT * IN table WHERE col2=#.

我迷路了.... :( 每个数字都有四个属性,一个在+频率之前,一个在+频率之后。

我这样想会更好吗?如果我在表中存储和增加频率,我就可以避免重复,从而加快我的查询速度?我最初在想,如果我存储每一个事件,以编程方式计算频率会更快......

如此简单的数据,但我只是不了解数据库的工作原理,不知道哪个更有效。


根据最近的评论,我想补充一些关于实际问题的信息:我有一个无限长的字符串。我正在尝试在此字符串中存储各种字符或字符 block 的马尔可夫链频率表。

给定字符串中的任意一点,我需要知道下一个状态的概率和前一个状态的概率。

我正在根据文本语料库和过去的用户输入来预测用户输入。与我见过的其他应用程序相比,一个主要区别是我在给定的时间沿着链条走得更远,更多的状态,我需要频率数据来提供多种可能性。

我希望这能更清楚地说明情况。我不想深入问题的本质,因为过去我提出的问题不够具体,无法得到具体的答案。


这似乎更好一些。我对这个解决方案的主要问题是:提供“ key ”(状态的前几个字符)会提高系统速度吗?即查询 state_key,然后仅查询该查询的完整状态的结果?

Table 1:
name: state
col1:state_id - unique, auto incrementing
col2:state_key - the first X characters of the state
col3:state - fixed length string or state

Table 2:
name: occurence
col1:state_id_left - non unique key from table 1
col2:state_id_right - non unique key from table 1
col3:frequency - int, incremented every time the two states occur next to each other.

QUERY TO FIND PREVIOUS STATES:
SELECT * IN occurence WHERE state_id_right=(SELECT state_id IN state WHERE state_key=? AND state=?)

QUERY TO FIND NEXT STATES:
SELECT * IN occurence WHERE state_id_left=(SELECT state_id IN state WHERE state_key=? AND state=?)

最佳答案

我不熟悉马尔可夫链,但这里尝试回答这个问题。注意:为了简化事情,我们将每个数字串称为“状态”。

首先我想象这样一张 table

Table states:
order : integer autonumeric (add an index here)
state_id : integer (add an index here)
state : varchar (?)

顺序:只需使用序号 (1,2,3,...,n) 这将使搜索上一个或下一个状态变得容易。

state_id:与州相关联的唯一编号。例如,您可以使用数字 1 来表示状态“1111111111...1”(无论序列的长度是多少)。重要的是状态的再次出现需要使用与之前使用的相同的 state_id。您可以根据字符串(可能减去一个数字)来制定 state_id。当然,只有当可能状态的数量适合 MySQL int 字段时,state_id 才有意义。

state:这是数字字符串 '11111111...1' 到 '99999999...9' ...我猜这只能存储为字符串,但如果它适合整数/数字专栏您应该尝试一下,因为您可能不需要 state_id

state_id 的要点是搜索数字比搜索文本更快,但在性能方面总是需要权衡取舍……剖析并确定瓶颈以做出更好的设计决策。

那么,您如何查找先前出现的状态 S_i ?

"SELECT order, state_id, state FROM states WHERE state_id = "然后附加 get_state_id(S_i) 其中 get_state_id 理想情况下使用公式为状态生成唯一的 ID。

现在,使用 order - 1 或 order + 1,您可以访问邻近的州并发出额外的查询。

接下来我们需要跟踪不同出现的频率。您可以在另一个表中执行此操作,该表可能如下所示:

Table state_frequencies:
state_id integer (indexed)
occurrences integer

并且只有在获得数字时才添加记录。

最后,您可以使用表格来跟踪邻近州的频率:

Table prev_state_frequencies (next_state_frequencies is the same):
state_id: integer (indexed)
prev_state_id: integer (indexed)
occurrences: integer

您将能够通过查看一个状态的出现次数(在 state_frequencies 中)与其前一个状态的出现次数(在 prev_state_frequencies 中)来推断概率(我想这就是您要尝试做的)。

我不确定我是否答对了你的问题,但如果这说得通,我想我答对了。

希望对你有帮助 啊

关于php - 奇怪的数据库设计,需要指导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14002434/

有关php - 奇怪的数据库设计,需要指导的更多相关文章

  1. ruby - 我需要将 Bundler 本身添加到 Gemfile 中吗? - 2

    当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/

  2. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  3. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  4. ruby - rspec 需要 .rspec 文件中的 spec_helper - 2

    我注意到像bundler这样的项目在每个specfile中执行requirespec_helper我还注意到rspec使用选项--require,它允许您在引导rspec时要求一个文件。您还可以将其添加到.rspec文件中,因此只要您运行不带参数的rspec就会添加它。使用上述方法有什么缺点可以解释为什么像bundler这样的项目选择在每个规范文件中都需要spec_helper吗? 最佳答案 我不在Bundler上工作,所以我不能直接谈论他们的做法。并非所有项目都checkin.rspec文件。原因是这个文件,通常按照当前的惯例,只

  5. ruby - 如何在 Lion 上安装 Xcode 4.6,需要用 RVM 升级 ruby - 2

    我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121

  6. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  7. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  8. ruby - 为什么在 ruby​​ 中创建 Rational 不需要新方法 - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Rubysyntaxquestion:Rational(a,b)andRational.new!(a,b)我正在阅读ruby镐书,我对创建有理数的语法感到困惑。Rational(3,4)*Rational(1,2)产生=>3/8为什么Rational不需要new方法(我还注意到例如我可以在没有new方法的情况下创建字符串)?

  9. ruby - 我如何添加二进制数据来遏制 POST - 2

    我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

  10. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

随机推荐