用于各种/可变内容的 PHP/MySQL 数据库设计 - 模块化系统

标签 php mysql design-patterns modularity

我正在尝试构建(现在只是在思考/规划/绘制关系 :])构建基本网站的小型模块化系统(主要是为了简化我们作为网页设计师日常执行的常见任务)。

我对数据库设计/存储内容的整个想法几乎一无所知。

1., 在大多数网站上最痛苦的是(根据我的经验),页面的布局/框架几乎相同,但信息不同——例如title, picture, and set of information - 但是,在cms中制作特殊模板/特殊模块恰好比将其作为文本编辑更耗费精力 - 然而,这里我们失去了一些操作潜力 - 我们无法获得“只有标题”,因为,CMS/系统将整个内容理解为一个文本字段

所以,我想要这两个表 - 一个保存内容结构的信息(例如,可变数量的照片 <1;500):],标题和文本和照片(大)和画廊) - 如何- 和另一个包含所有内容、模块和部分“集合”(我对各种结构化信息的工作名称)的表格 - 什么

table module_descriptors (HOW)  
id int  
structure - *???*  

table modules (WHAT)  
id int  
module_type - @link to module_descriptors id
content - *???*  

2., 我喜欢这个是 - 我不需要很多表 - 我不喜欢有 6810 个表的数据库,每个模块一个,用于它的描述,用于杂项。数字与文本的关系,...我也不喜欢有 60 列的表格,例如 content_uscontent_itcategory_idparent_id.

我想我可以将结构描述和内容本身(注意 ??? ?)保存为 XML 或 CSV,但也许我正在尝试重新发明轮子并回答这隐藏在一些我没有研究过的设计模式中。

希望我能说得通,并能得到一些回复 - 给我你的意见、优点、缺点……或者让我下 hell 。谢谢

编辑:我的问题也是:这种方法有意义吗?它对编辑友好吗?没有更好的东西吗?这是道德的吗?当我这样做时小猫不会死吗?如果我想读取和比较从数据库中提取的 30 个 XML(例如,我想比较某些东西),这对服务器来说不是太多了吗?技术部分 - 如何去做 - 只是问题的一部分:)

最佳答案

您暗示的设计模式称为 Serialized LOB .对于每个条目都相同的属性,您可以以常规方式(作为列)存储一些数据。对于可变属性,将它们格式化为 XML 或 MarkDown 或您想要的任何格式,并将其存储在 TEXT BLOB 中。

当然,您将无法使用 SQL 表达式查询 BLOB 中的单个元素。您需要在搜索或排序中使用的任何内容都应位于常规列中。


回复:如果你的文本blob是XML格式的,你可以用XML functions搜索它MySQL 5.1 及更高版本支持。但这无法从索引中获益,因此会导致搜索速度非常慢。

如果您尝试将 LIKERLIKE 与通配符一起使用,情况也是如此。如果不使用索引,搜索将导致全表扫描。

您也可以尝试使用 MySQL FULLTEXT索引,但这不是搜索 XML 数据的好解决方案,因为它无法区分文本内容与 XML 标记名称和 XML 属性。

因此,只需对要搜索或排序的任何字段使用常规列即可。这样你会更快乐。


回复问题:如果你的文档真的需要可变结构,你的选择就很少了。如果使用得当,SQL 假定每一行都具有相同的结构(即列)。您的选择是:

有些人求助于称为实体属性值 (EAV) 的反模式来存储变量属性,但老实说,不要去那里。有关这可能会出错到什么程度的故事,请阅读这篇文章:Bad CaRMa .

关于用于各种/可变内容的 PHP/MySQL 数据库设计 - 模块化系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2135978/

相关文章:

PHP header() 调用 "crashing"脚本出现 HTTP 500 错误

PHP:从元素中删除超链接但保留文本和类

mysql - 有没有更好的方法在 MySQL 中编写 NOT IN(子查询)?

java - jSingleton 应该替换为单个或多个接口(interface)。这实际上意味着什么?

oop - Golang 在具有私有(private)访问权限的结构中嵌入接口(interface)

php - 多组 html 复选框的相同 Javascript

PHP Tidy 删除空格并插入换行符

php - 从mysql中的多个左联接清除结果

java - 提高矩阵/表聚合和搜索的性能

javascript - 存储附加到用户贡献内容的 YouTube 内容的最佳方法是什么?