通过规范化这张表,我会获得性能提升吗?

时间:2012-08-22 18:35:52

标签: php mysql join database-normalization

我在我的服务器上运行了一种论坛修改代码。在我的数据库中,我有一个名为core HUGE 表,它基本上包含了所有可管理的设置,其中有很多。我的问题是,我应该将其正常化吗?

我创建了一个小提琴,向您展示这张桌子有多大:http://sqlfiddle.com/#!2/f4536/1

您会看到一些名为gear_notificationsgear_bankgear_*等的列。这些列表示某个系统是否已打开。例如,如果gear_bank=1,则启用银行系统。目前,在我的DB文件的__construct中,我运行以下查询:

$settings = mysql_query("SELECT GROUP_CONCAT(d.domain) AS domains, GROUP_CONCAT(d.zb) AS zb_info, c.* FROM core c JOIN domains d ON d.cid = c.id WHERE c.id ='$cid' LIMIT 1");

忽略JOIN你可以马上看到问题;无论相应的系统是否已打开,查询都会从core表返回EVERY字段。例如,如果gear_bank=0,查询仍将返回bank_namebank_history_perpagebank_*等。虽然这不会对代码的运行方式产生任何物理问题(如它可以忽略它不需要的任何数据),我更喜欢它不需要加载那些数据。

我最好创建一个名为core的表,其中包含所有gear_*值,然后是相应的表(core_bankcore_*等)以获取相应的值吗?

我一直在查询这个(不好的双关语,对不起!)一段时间了,我只是不知道这是否会为我的代码提供性能提升。请注意,上述查询将在每个页面上运行。

如果我要恢复到新系统,即多个表格,我将如何获得所需的所有信息?我不想对core运行一个查询来确定打开哪些系统,然后在所有相应的表上运行额外的查询。我更喜欢根据JOINgear_*的值core所有必要表格的一个查询。那可能吗?

我还没有发布这个论坛修改,所以我可以根据自己的喜好进行尽可能多的更改而不会产生任何真实的影响:)

1 个答案:

答案 0 :(得分:0)

如果将核心拆分为多个表,则可以使用NULL来指示特定条目是否具有特定系统的信息。然后,连接将按预期工作。

然而,你的桌子真的不是那么大,而且你真的会注意到它在应用程序级别的任何速度提升都会被打破。

如果您不需要查询单个列,则只需使用一个TEXT列,将所有属性放入数组中,然后将数组序列化到文本列中。