Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 多个客户机表或大型整体表_Php_Mysql_Sql_Database - Fatal编程技术网

Php 多个客户机表或大型整体表

Php 多个客户机表或大型整体表,php,mysql,sql,database,Php,Mysql,Sql,Database,我最近接管了一个链接到大型MySQL数据库的项目,该数据库最初是多年前设计的,需要一些帮助 目前,DB每个客户端有5个表,用于存储其用户信息、交易历史记录、日志等。但是,我们目前有约900个客户端申请使用我们的服务,平均每周有5个新客户端申请。因此,数据库已经增长到近5000个表,而且还在不断增加。我们的许多客户最终没有使用我们的服务,因此他们的表都是空的,但仍在数据库中 最初的DB设计器说,它是以这种方式创建的,因此如果一个表被破坏,它将不会显示任何其他客户端的信息 在用PHP重新设计项目时,

我最近接管了一个链接到大型MySQL数据库的项目,该数据库最初是多年前设计的,需要一些帮助

目前,DB每个客户端有5个表,用于存储其用户信息、交易历史记录、日志等。但是,我们目前有约900个客户端申请使用我们的服务,平均每周有5个新客户端申请。因此,数据库已经增长到近5000个表,而且还在不断增加。我们的许多客户最终没有使用我们的服务,因此他们的表都是空的,但仍在数据库中

最初的DB设计器说,它是以这种方式创建的,因此如果一个表被破坏,它将不会显示任何其他客户端的信息

在用PHP重新设计项目时,我考虑重新设计DB,使用客户机的唯一id引用整个用户、事务历史、日志等表

这种方法是正确的还是DB应该保持原样

您是否发现任何可能的安全/性能问题


感谢您的帮助

您应该重新设计系统,使其只有五个表,并用一个单独的列标识该行所属的客户机。SQL可以很好地处理大型表,所以您不必担心性能。事实上,在许多情况下,拥有很多很多表可能会妨碍性能

这有很多好处。您将能够一次优化所有客户端的表结构。不再试图向300个表添加索引以满足某些性能目标。管理数据库、管理表、备份—使用单个表,所有这些都应该更容易

您可能会发现数据库甚至变得更小。这是因为,平均而言,这数千张表格中的每一张最后都有半页的内容。这将从数千页半变成一页


一个缺点是安全性。在表上设置安全性比在表中设置一行更容易。如果这是一个问题,您可能需要考虑这些要求。

这可能只是一个品味问题,但我会发现,将这些信息存储在尽可能少的表中更自然,也更易于维护。而且,大多数(如果不是所有的话)数据库ORM都会期待这样的结构,没有理由重新发明这个轮子

从安全性的角度来看,这个项目听起来像是一个web应用程序。显然,我不知道您正在处理的业务逻辑的实际情况,但似乎不管表权限如何,对数据库的所有访问都将通过代码库进行,在这种情况下,应用程序本身需要对所有表拥有完全权限,这就抵消了将表分开的任何优势

如果安全措施有令人信服的理由——比如,将数据独立于web应用程序输入数据库的不同服务,我仍然会探索在应用程序层而不是数据库层处理身份验证的方法。以这种方式处理安全规则会容易得多。与在5000多个不同的地方设置规则不同,单一的安全规则“如果用户id等于用户id列,则仅允许用户查看一行数据”更简单、更容易理解,因此更易于维护(并且可能更安全)


不同的人以不同的方式处理数据库。我是一名web开发人员,因此我将数据库视为存储数据的地方,仅此而已,因为它始终是一个专用的、通常是单一用途的数据库安装,我在应用程序级别处理所有其他逻辑。有些人将数据库视为应用程序本身,他们将ar在其大规模、分布式、多用户系统中更广泛地使用内置安全功能,但老实说,我对这些场景的了解还不够,无法就这条线的确切位置发表评论。

你是说为每个客户端单独设置一行吗?另外,为了增加安全性,我觉得剪切维护需要保持如此多的安全表可能会使它们的安全性低于一个大型集中表。@Elias…我指的是一个单独的列,用于标识每个表中的客户机。是否有拒绝投票的原因?没有解释的拒绝投票似乎是恶意的。更妙的是,我更改了第一句,以澄清额外的列是用于“识别该行属于哪个客户机”。您可以做的一件事是制定一项策略,说明轮胎踢球者内容如何以及何时被分包,例如,删除未使用的帐户。