1

我正在我的服务器上运行一种论坛修改代码。在我的数据库中,我有一个名为 的巨大core,它基本上包括所有管理员可编辑的设置,其中有很多。我的问题是,我应该标准化吗?

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

您会看到一些名为gear_notificationsgear_bank等的列gear_*。这些表示某个系统是否已打开。例如,如果gear_bank=1,则银行系统已打开。目前,在__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表中的每个字段,无论相应的系统是否打开。例如,如果gear_bank=0,查询仍将返回bank_name,bank_history_perpagebank_*。虽然这不会对代码的运行方式造成任何物理问题(因为它可以忽略任何不需要的数据),但我更喜欢它没有不必加载该数据。

我会更好地创建一个名为的表core,其中包含所有gear_*值,然后为它们的相应值创建相应的表(core_bankcore_*)吗?

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

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

我还没有发布这个论坛修改,所以我可以在没有任何实际影响的情况下进行尽可能多的更改:)

4

1 回答 1

0

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

但是,您的表实际上并没有那么大,而且您是否会通过拆分它来真正注意到应用程序级别的任何速度改进是值得怀疑的。

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

于 2012-08-22T19:19:55.507 回答