用于在MySQL中存储单行数据的更好的数据库表结构是什么?

时间:2016-07-27 16:40:31

标签: php mysql database-design

所以我不确定如何标题这个问题。我正在创建一个数据库,需要存储一些默认的SEO信息,如下所示。

default page title
default keywords
default page description
header code
footer code

每个字段永远不会超过1个条目。所以问题是我是否在数据库中创建了一个表,其中包含每个数据类型的列,并且理解只有1行数据?

或者我是否创建了一个表,其中每个字段都有一个名称列,然后是一个数据列(文本)?使用此选项,我可以看到我无法为每个字段设置数据类型,而是每个字段都必须是tinytext或varchar。

以下是我正在考虑的2个数据库表结构。

CREATE TABLE `cms_seo` (
`id` int(2) NOT NULL,
`name` VARCHAR(100) NOT NULL,
`data` tinytext NOT NULL,
PRIMARY KEY (`id`)
)
INSERT INTO `cms_seo`
(`id`, `name`, `data`)
VALUES
(1, 'Website Keywords', ''),
(2, 'Default Page Title', ''),
(3, 'Default Page Description', ''),
(4, 'Header Code', ''),
(5, 'Footer Code', '');

OR

CREATE TABLE `cms_seo`(
`id` INT(1) NOT NULL AUTO_INCREMENT,
`default_page_title` VARCHAR(500) NOT NULL,
`default_keywords` VARCHAR(1000) NOT NULL,
`default_page_description` TINYTEXT NOT NULL,
`header_code` TINYTEXT NOT NULL,
`footer_code` TINYTEXT NOT NULL,
PRIMARY KEY (`id`)
)
INSERT INTO `cms_seo`
(`id`,
`default_page_title`,
`default_keywords`,
`default_page_description`,
`header_code`,
`footer_code`)
VALUES
(NULL, '', '', '', '', '');

是否可以替代存储此数据?比如在文本文件中?数据需要通过cms进行编辑。

3 个答案:

答案 0 :(得分:2)

这是一种常见的模式,可以将您描述的数据类型存储在"键/值"格式就像你的设计#1。一些优点包括:

  • 如果您的应用程序需要某个新属性的默认值,您可以通过插入新行来添加它。
  • 对MySQL中行的宽度有实际限制。但是您可以根据需要添加任意数量的行。
  • 如果默认列表变长,则只能查询一行。如果您有索引,查找单行会更有效。

设计优势#2:

  • 您可以使用MySQL数据类型分别约束每列的长度或格式。设计#1要求您使用可以存储任何可能值的数据类型。
  • 您将属性名称存储为元数据,而不是字符串。使用元数据属性名称更多"正确"关系数据库设计。

我过去曾多次发帖,不鼓励人们使用"键/值"数据设计。但是当你只有一组值时,它就是对该设计的合法使用,例如你的情况下的默认值。

正如您所提到的,另一个选项是将数据存储在文件中,而不是数据库中。见http://php.net/manual/en/function.parse-ini-file.php

另一种选择是将默认值存储在PHP文件中只需声明它们的哈希数组。这种技术的一个优点是PHP文件通过PHP转换为字节码然后缓存。

但是,既然您说您必须能够通过应用程序编辑值,您可能会发现将其存储在数据库中更容易。

答案 1 :(得分:1)

这个答案实际上是在一个美化的评论和一个完整的答案之间。我更喜欢选项#2,因为在未来的某个时候,您可能需要的不仅仅是一个占位符记录。此外,如果你使用第二个选项,你可以使用MySQL的关系功能,例如按列名加入。

答案 2 :(得分:1)

只有一行的表没有错。 (关系上,它唯一的候选键是{},但SQL不允许你直接表达它。)

相关地,即如果您想询问关于个别关键字或关键字集合的任意问题,那么您应该存储,查询&操纵这个" row"作为两个表:

CREATE TABLE `cms_seo`(
`id` INT(1) NOT NULL AUTO_INCREMENT,
`default_page_title` VARCHAR(500) NOT NULL,
`default_page_description` TINYTEXT NOT NULL,
`header_code` TINYTEXT NOT NULL,
`footer_code` TINYTEXT NOT NULL,
PRIMARY KEY (`id`)
)
CREATE TABLE `cms_seo_keyword`(
`seo_id` INT(1) NOT NULL,
`default_keywords` VARCHAR(1000) NOT NULL,
PRIMARY KEY (`seo_id`, `default_keywords`),
FOREIGN KEY (`seo_id`) REFERENCES `cms_seo` (`seo_id`)
)

您可以根据这些声明cms_seo来声明视图。理想情况下,您可以使用此数据库尽可能地编程。

PS Design 1是一款EAV设计。研究EAV的问题。从本质上讲,这意味着您正在使用DBMS来实现&使用一个(bug填充功能不佳)程序,其所需的功能是... DBMS。如果您使用DML& amp证明了直接的关系设计,那么您应该只使用这样的设计。 DDL的性能不足,但EAV设计确实如此。 (这包括EAV缺点的现值/费用。)