MySQL 数据库 - 将数据存储在一个表中或使用查找
Posted
技术标签:
【中文标题】MySQL 数据库 - 将数据存储在一个表中或使用查找【英文标题】:MySQL Database - storing data in one table or using lookups 【发布时间】:2012-10-28 13:19:36 【问题描述】:我正在重新设计一个应用程序,该应用程序在特定表中包含 100,000 条记录(目前为 250,000 并且还在增长)。
该表包含网站和域的信息。
为了速度和资源,我应该在原始表中包含有关任一实体所需的所有数据,还是应该使用两个查找表来存储未共享的信息 - 例如一个存储所有特定于域的查找表info 和一个存储所有站点特定信息的信息?
谢谢
【问题讨论】:
明确一点,域和站点没有关联——它们是两个独立的实体。虽然网站在技术上确实有一个“域”,但就我在这里所做的而言,如果它具有流量和收入以及某种视觉存在而不是保留页面,则它被归类为网站。域只是域,没有别的。使用在汽车和货车上存储信息的示例可能更容易,它们都是车辆,但我需要存储信息的属性略有不同。 【参考方案1】:理想情况下,您应该将它们分成 2 个不同的表,因为单个域将对应多个站点,如果我们采用将域和站点的元数据存储在单个表中的设计,在这种情况下,需要在站点元数据的每条记录中为域存储冗余信息。相反,如果我们有 2 个单独的表,其中域表每个域有一条记录,并且作为记录中的字段之一的站点列表和站点表中的域名列来计算给定站点的域,它将确保有组织的存储和没有数据冗余。这是传统 RDBMS 系统的主要原则,这也是我们提出多表概念的原因。
此外,如果您想真正扩展您的数据库,您可以考虑使用 NOSQL 数据存储,正如您所说的数据在不断增加。 Apache HBase 可能是一个很好的解决方案,它具有将相关信息分组在一起的概念。
编辑:
问题的澄清:
Just to be clear, domain and sites are not linked. They're just different entities like a domain with no traffic or revenue would be classed as a domain and have domain related data stored for it like number of hyphens or registrar while a domain with a Wordpress install for example and exisitng traffic would be classed as a site - not a domain - and have site specific information stored. Would this change your answer?
在它们不相互关联的情况下,我认为将数据拆分为多个表不会有任何帮助,除非您要使用分布式 RDBMS 系统。在单节点托管数据库的情况下,行无论如何都由站点/域 id 索引,并且单个表中的大量行不会降低性能,但是如果您正在查看庞大的数据大小并希望将其划分到集群中的多个节点上,然后为它们提供独立的表将有助于使每个表都托管在各个节点上,并且数据库能够水平扩展。这是我在这种情况下看到的唯一好处。
【讨论】:
感谢您的建议。需要明确的是,域和站点没有链接。它们只是不同的实体,例如没有流量或收入的域将被归类为域,并为其存储域相关数据,如连字符或注册商的数量,而具有 Wordpress 安装和现有流量的域将被归类为一个站点 - 不是一个域 - 并存储了站点特定的信息。这会改变你的答案吗? @thatguy - 哦!在那种情况下,我误解了你的问题。我正在根据您的说明编辑答案,它位于“编辑”标题下。【参考方案2】:应用程序的性能很大程度上取决于应用程序使用的查询类型。将所有数据存储在一个表中不一定会降低性能,但很可能会提高性能。如果您的表保存了 XY 先生拥有 example.com 数千次的信息,那么您当然是在浪费磁盘空间。
规范化您的数据库(拆分数据)可能会有所帮助,但您必须知道您想对数据做什么才能回答这个问题。
【讨论】:
以上是关于MySQL 数据库 - 将数据存储在一个表中或使用查找的主要内容,如果未能解决你的问题,请参考以下文章
SQL 数据库存储不同类型的值(在单个字段中或模拟为单个字段)
将提要流项目 NSObject 存储在磁盘中或作为 JSON