所以我不确定如何标题这个问题。我正在创建一个数据库,需要存储一些默认的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进行编辑。
答案 0 :(得分:2)
这是一种常见的模式,可以将您描述的数据类型存储在"键/值"格式就像你的设计#1。一些优点包括:
设计优势#2:
我过去曾多次发帖,不鼓励人们使用"键/值"数据设计。但是当你只有一组值时,它就是对该设计的合法使用,例如你的情况下的默认值。
正如您所提到的,另一个选项是将数据存储在文件中,而不是数据库中。见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缺点的现值/费用。)