将SQL个数据分到不同的表中

Divide SQL data in different tables

我想将用户的数据拆分到不同的 table 中,这样就不会有包含所有数据的巨大数据...

问题是在与主要数据不同的 table 秒内,我无法识别每个数据属于谁。

在注册期间,我是否应该在每个 table 中存储相同的用户 ID?它不会创建不必要的重复项吗?

编辑: 例子

table:

| id | user | email | phone number| password | followers | following | likes | posts |

变成

table 1:

| id | user | email | phone number| password |

table 2:

| id | followers num | following num | likes num | posts num |

我相信我理解你的问题,如果你想知道,你可以使用外键。当您有用户列表时,请确保每个用户都有一个特定的 ID。

稍后,当您插入有关用户的数据时,您可以通过会话变量或获取请求插入用户 ID。 (插入不同的table)

然后,当您需要从那个不同的 table/s 为该特定用户提取数据时,您可以 select 从 table where id = session[id] 或 get[编号]

有帮助吗?

答案:使用外键使用 gets 和 session 识别用户数据

如果您要从主 table.

中删除这些值,请不要担心重复

我想你想使用 LEFT JOIN

SELECT t1.[user], t2.[posts]
FROM Table1 AS t1
LEFT JOIN Table2 AS t2 ON t1.id= t2.id

编辑:这是一个 link 文档,解释了 different types of JOINS

这看起来像一个“XY 问题”。

您想“不要有一个巨大的table”。但是为什么你有这个需求呢?

可能是因为在一些场景中一些响应比你预期的要慢。

而不是像 Gordon Linoff 提到的那样将 table 以任何方式拆分,这是一个 SQL 反模式并且比以前更容易让你陷入困境,你应该 监控 您的系统并测量您使用的各种查询的性能,按频率对它们进行权衡。也就是说,如果查询 #1 每个周期执行十万次并且耗时 0.2 秒,那么您应该将查询 #1 计入 20,000 秒。查询 #2 花费了五十倍的时间 - 整整十秒 - 但只有 运行 一百次,只会累积第一次总时间的二十分之一。

(由于最终用户 会注意到 长时间的延迟,有些人使用此公式的变体,其中您将 平方的一个查询的实例相乘 - 或更高的幂 - 其持续时间(以毫秒为单位)。这样,较慢的查询会引起更多关注)。

不管怎样,一旦您知道 哪些 查询您应该首先优化,然后您就可以开始优化您的架构。

首先要检查的是索引。也许标准化。这些涵盖了我迄今为止遇到的“低绩效”案例的三分之二。

然后是细分。可能不是您的情况,但您可能有 table 笔交易或您通常只对当前太阳能或财政年度感兴趣的交易。 添加 包含该信息的列将使 table 更大,但仅选择那些至少符合年份条件的记录将使大多数查询 运行快点。这在较低级别也受支持(请参阅“分片”)。

然后是粗心的 JOIN 和子 SELECT。通常它们从小而快开始,所以没有人费心去检查索引、规范化或这些条件。几年后,内部 SELECT 收集了一百万条记录,而外部 JOIN 丢弃了其中的九十九万九千条。翻译subselect里面的discarding condition,看看查询起飞。

然后你可以检查一些信息是否真的很少访问(例如,我有一个数据库,每个用户都有一堆财务信息,但这只在大约 0.1% 的请求中需要。所以在那种情况下是的,我已将这些信息拆分为辅助 table,同时也有可能支持在系统中注册了多个银行账户的用户。That was not 请注意,我为什么这样做)。

在这一切中,也要考虑到时间和金钱。进行分析、运行进行修改并检查它们,再加上任何停机时间,都会产生一些成本,甚至可能会增加维护成本。也许 - 只是也许 - 将更少的钱投入到更快的磁盘或更多的 RAM 或更多或更快的 CPU 中可能会实现相同的改进,而无需更改架构或代码库。

一个table可能有一个AUTO_INCREMENT代表PRIMARY KEY;另一个 table 将具有相同的 PK,但不会是 AUTO_INCREMENTJOINing table 将把 table 放入 "back together" 进行查询。

"vertically partition" table 很少有好的理由。一种罕见的情况是拆分 "like_count" 或 "view_count"。这样主要的 table 就不会被持续不断的 UPDATEing 计数器打扰了。在某些极端情况下,这可能有助于提高性能。