mysql - 生成庞大的未知数据库的一般架构

标签 mysql phpmyadmin

我需要为一个从未使用过的庞大数据库建立一个通用模式。
问题是,我不知道如何/在哪里开始这样做,因为不考虑大小,我不知道每个表的用途。我能猜出一些,但它们的市长制是通用名称字段对我什么也不说。
你有什么建议吗?我能做什么?
没有关于数据库的文档,创建者无法帮助我,因为他们现在在另一家公司。
非常感谢你的进阶。

最佳答案

这不容易。
首先收集存在的任何文档、注释等。此外,深入了解所存储的数据类型和应用程序将有很大帮助。充分记录你的发现,并建立之前应该建立的文档。
如果数据库包含已声明的外键,则可以从那里开始,至少可以了解表之间的关系。记住这可能是不完整的。正如@John Watson所指出的,如果关系被声明了,那么有工具可以帮你做到这一点。
检查存储的函数和过程,包括触发器。尽管这些在MySQL数据库中并不常见。触发器通常会产生一些提示(“表X的每次更新都会向表Y插入一个新行”->“表Y可能是一个日志或审计表”)。
有些表是很明显的,如果你知道与它们相关的是什么,你就可以开始找出那些相关的表。
希望您能够访问应用程序代码,您可以通过grep和read来查找线索。访问一个可以重复销毁的测试环境也很有用(“如果我在应用程序中更改了这个,数据库在哪里更改呢?”;“如果我扰乱这些值,会发生什么?”;等)。如果按主键或唯一键顺序转储表,则可以转储表并对其使用diff
执行SELECT DISTINCT foo FROM table之类的查询可以帮助您了解列中可以有哪些不同的内容。
如果可以从一个几乎为空的数据库(例如,运行应用程序所需的最少资源)开始,那么在向应用程序添加数据时,您可以观察到哪些更改。当数据库很小时,转储数据库要快得多。同样的方法也适用于扩散,同样的方法也适用于读取输出。在一个小小的数据库中,有些事情更容易理解,但有些事情则更难理解。当您拥有一个巨大的数据集,并且一列总是3时,您可以更加确信它总是3。
您可以监视应用程序中的SQL流量,了解它们为每个函数访问哪些表和列,以及它们如何连接它们。监视SQL流量可以通过特定于应用程序的方式(例如,DBI跟踪)或特定于服务器的方式(打开常规查询日志)来完成,也可以使用类似Wireshark或tcpdump的数据包跟踪程序来完成。这取决于你工作的环境。例如,如果必须在生产系统上执行此操作,则可能需要Wireshark。如果您是在dev/test中这样做的,MySQL查询日志的缺点是所有的应用程序都可能很好地混合在一起,如果有多个用户正在访问这些应用程序,那么它将变得混乱。应用程序特定的日志可能不会受此影响,但应用程序当然可能没有。
记住数据存储的各种方式。例如,这三项都可能意味着1980年5月1日:
1980-05-01-作为日期、时间戳或文本。
2444330.5-儒略日(带时间,指定在午夜)
44360-改良儒略日
326001600-UNIX时间戳(带时间,指定午夜),假设本地时间是美国东部时间(自1970年1月1日起的秒数)
数据库中可能有未规范化的内容,其中一些可能未正确规范化。例如,您可能想知道“为什么这个用户在一个表中有一个名字Bob,在另一个表中有一个名字Joe?”答案是“数据损坏”。
可能有未使用的列。可能有整张桌子没用。尽管如此,他们可能仍然有来自旧版本的应用程序(或其他不再使用的应用程序)的数据、从MySQL控制台运行的查询等。
可能有些东西在应用程序中不可见,但已被使用。在不了解应用程序中实现的算法的情况下,它们的目的可能完全不明显。例如,应用程序中的搜索功能可以存储有关要搜索的文档及其连接的各种预计算信息。更糟糕的是,这些表可能只由批处理作业更新,因此更改文档不会触及它们(使您误以为它们与文档无关)。然后,你第二天早上来,桌子神秘地大不相同。不过,在搜索案例中,运行搜索时的查询日志会告诉您。

关于mysql - 生成庞大的未知数据库的一般架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7904959/

相关文章:

php - 按日期从数据库回显的结账订购日志

mysql - 由于 where 子句,查询给出空结果

php - 如何根据以前的答案确定在测验中向用户询问哪些问题

MySQL 导出/导入空/空多行字符串

mysql - 在 Phpmyadmin 中更改 Mysql 服务器的端口

php - 使用 near 的 mysql 正确语法

mysql - 无法在 MySql 中将 varchar 转换为 datetime

mysql - phpMyAdmin 中的 SQL 保留字语法错误

c# - VS 错误 : The value for column 'IsPrimaryKey' in table 'TableDetails' is DBNull

php - 如果没有更多条目要加载,在 mysql 查询中添加 if 语句?