【问题标题】:Storing lists: in files or MySQL?存储列表:在文件中还是在 MySQL 中?
【发布时间】:2013-02-01 20:57:40
【问题描述】:

一般来说,存储以下类型列表的更好方法是:

array(
   'category'=>array(
      'key'=>'value',
      'key'=>'value'
    ),
   'category'=>array(
      'key'=>'value',
      'key'=>'value'
    )
);

存储这些列表的更有效方法是lists.php 文件还是 MySQL 中的序列化条目?

【问题讨论】:

  • 这个数据是“静态的”还是“动态的”?如果是“静态”-> PHP 文件。如果是“动态”-> mySQL。
  • @RefugnicEternium 它是静态的。谢谢!
  • @AlexHowansky 在各个类别中总共有大约 600 个键/值对。
  • 它们多久更改一次?当您的代码需要在列表中查找某些内容时,是否经常需要进行多次查找?还是只有一两个?
  • @AlexHowansky 如果它确实发生了变化,它将每隔几年只有一个,并且每次页面加载都会查找一次(如果需要)。

标签: php mysql data-storage


【解决方案1】:

这取决于你的 mysql 表结构:

  • 如果您的表是NORMALIZED,那么对数据进行序列化和存储将破坏规范化。

但除此之外,为什么不创建两个表,一个存储类别,另一个存储引用该类别的键值对。

CREATE TABLE Categories (
   CID INT,
   ***
   PRIMARY KEY (CID)
)ENGINE=InnoDB;

CREATE TABLE KeyValues (
   Category INT,
   Key varchar(100),
   Value varchar(100,
   FOREIGN KEY Category REFERENCES Categories(CID)
)ENGINE=InnoDB;

您可以根据您的结构进一步规范化键值表。我没有故意选择主键,因为这取决于您是否正在规范您的表。添加自动增量主键也可以。

这样选择数据更容易、更快捷。当你有序列化数据时,如果你需要做某种计算,你首先需要在 PHP 端抓取,取消序列化并进行计算,你可以通过一个查询来做同样的事情。

【讨论】:

  • 是的,我不推荐序列化条目。如果要使用数据库,请使用关系表。
【解决方案2】:

我建议你使用mysql,更容易维护,而且你可以很容易的挑选出你需要的行,而不必将整个数组加载到内存中。 您也可以尝试使用像 mongoDB 这样的 nosql 数据库。

【讨论】:

    【解决方案3】:

    除非需要,否则不要使用数据库,这会增加不必要的开销、复杂性并引入新的故障点。在这种情况下,我会将列表编码为 PHP 源数组。它将更快并且更容易实现 - 您可以在几秒钟内启动此代码。我认为在这种情况下使用数据库没有任何优势。存储 600 个元素的数组所需的开销可以忽略不计。如果您后来发现数组变得太大而无法合理,或者需要经常更改,您可以将其移动到数据库中。不要过度设计它。

    【讨论】:

      猜你喜欢
      • 2011-03-24
      • 2014-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多