首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DB结构:具有公共ID的多个表

DB结构:具有公共ID的多个表
EN

Stack Overflow用户
提问于 2014-01-18 18:00:32
回答 2查看 261关注 0票数 0

我正在构建一个应用程序,它需要管理各种对象(目前有3个,但时间可能会增加)。所有这些对象都具有使用相同格式的唯一ID,但没有其他共同的属性。

所以我为每个对象创建了一个表,但我想知道如何通过I进行优化搜索。我想从一开始就构建一个很好的过程,因为总行数可能会变得非常高,而且我不想在几个月内重写代码,因为它会变得太慢。

我想到了NoSQL数据库,但我需要使用MySQL。PHP代码使用Laravel 4和雄辩的ORM。

假设我想要ID为abcd-123456的项,我不知道要查询哪个表,所以我想到了以下几点:

  1. 插入对象时,将ID与表名一起存储在另一个表(CommonIndex)中。
  2. 按ID查询时,在CommonIndex表中查找表名,存储在$tableName变量中
  3. 在雄辩中使用$tableName::find('abcd-123456')检索最终数据(使用与我的表完全相同的模型)

但是当我不得不在300k+行中搜索我的ID时,我担心这个过程会变得缓慢

对于如何改进这个过程,或者建立一个新的过程,有什么想法吗?

谢谢!

编辑:更多信息:

  • 我的表不是相互链接的,每个表都代表一种对象类型。
  • 每个表都有一个ID字段
  • 每个对象都有一个唯一的ID,但格式相同(例如:表1包含对象ab-1 de-3 hi-5、表2、cd-2 gh-4 jk-6等.)
  • 来自不同类型的两个对象不能具有相同的ID
  • 我不分配ID,每个对象已经有一个
  • 大多数搜索将通过ID完成,因为这对用户来说更容易
  • 在特定情况下,用户可能在与ID不同的字段上搜索产品,但我对性能没有同样的担忧,因为这将是非常罕见的
  • 为了便于搜索其他字段,将对这些特定字段进行索引(每个表1或2个)。
  • 搜索将是一个接一个。
  • 如果我沿途添加了一批搜索,我将逐个处理它。
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-18 18:26:04

问题:

对不起,我还没有50名代表,所以我不能补充意见,但我有一些问题:

身份证是从哪里来的?是来自外部系统吗?还是你给了他们身份证?

你为什么要用身份证搜索?为了内部目的还是用户会使用这些ids?

这些ids真的是字母顺序吗?数字会更有效率。

您是同时使用多个ids进行搜索,还是一个接一个地搜索?

一个可能的解决方案:

您可以做的一件简单的事情(取决于您的需要)是只使用一个包含两个列的表:

  • 你的身份证
  • 作为字符串存储的PHP对象(也称为序列化)

不过也有不好的一面。查看这个URL的优缺点:http://www.mysqlperformanceblog.com/2010/01/21/when-should-you-store-serialized-objects-in-the-database/

(例如,如果您需要搜索id以外的其他属性,它将无法工作。如果您需要经常更新DB,那么它也不是更有效的方法)

在PHP中序列化和取消序列化对象是非常容易的:

代码语言:javascript
复制
$a = your_object;
$s = serialize($a);
// save data into database. $s is now your object, but in a string format.

// retreive the value from your database ($s)
$s = get_from_database($id);
$a = unserialize($s);
// do whatever you want now with your object

另一个解决方案是您提到的解决方案,但我不会存储表名。一个数字更有效率。

最新情况:

由于不能真正存储序列化的对象,所以我认为您建议的是最好的方法。对于MySQL,300 k是可管理的,只需确保id列上有索引即可。

此外,如果经常搜索特定的一组列(例如,用户通常按id、名字和姓氏进行搜索),则需要在这两列上使用复合索引(这需要更多的磁盘空间艰难)。

如果您想确保查询(1用于获取表,第2条用于获取数据)将是有效的,您可以使用一个小的php脚本(带有插入的循环)或数据生成器(我找到了这个条目:http://www.generatedata.com/)轻松地输入300 K条目。

我将在两个表中输入300k (在您的“索引”表和一个对象表中),并测试进行两个查询所需的时间,一个查询"index“表,另一个查询对象表。

您可以尝试的另一件事是使用存储过程(您可以根据存储过程中对象的类型选择表)。

票数 4
EN

Stack Overflow用户

发布于 2014-01-18 19:59:24

单查询解决方案有一个根本问题:您不知道每个对象返回的是哪些列,因为列取决于类型。

使用CommonIndex表的方法听起来是一种合理的方法。只需确保在每个对象表上都对id列进行了索引。

我确实感到惊讶的是,共享id通用格式的对象没有任何共同的字段。如果有公共字段,那么这些字段将放在CommonIndex中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21207780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档