【问题标题】:PHP/MySQL database design for various/variable content - modular system针对各种/可变内容的 PHP/MySQL 数据库设计 - 模块化系统
【发布时间】:2010-01-25 21:59:25
【问题描述】:

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

我对数据库设计/存储内容的整个想法几乎没有任何兴趣。

1.,大多数网站(根据我的经验)最痛苦的是具有准相同布局/骨架的页面,具有不同的信息 - 例如标题、图片和信息集——但是,在 cms 中制作特殊模板/特殊模块碰巧比将其编辑为文本花费更多的精力——然而,在这里我们失去了一些操作潜力——我们不能得到“只有标题”,因为,CMS/系统将整个内容理解为一个文本字段

所以,我想要这两张表 - 一张用于保存内容结构的信息(例如,只是可变数量的照片

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,但也许我正在尝试重新发明轮子并回答这隐藏在一些我没有研究过的设计模式中。

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

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

【问题讨论】:

    标签: php mysql design-patterns modularity


    【解决方案1】:

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

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


    重新评论:如果您的文本 blob 是 XML 格式,您可以使用 MySQL 5.1 及更高版本支持的XML functions 搜索它。但这不能从索引中受益,因此会导致搜索速度非常慢。

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

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

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


    再问:如果您的文档确实需要可变结构,那么您几乎没有选择。如果使用得当,SQL 会假定每一行都具有相同的结构(即列)。您的选择是:

    有些人使用一种称为实体-属性-值 (EAV) 的反模式来存储变量属性,但老实说,不要去那里。有关这可能出错的严重程度的故事,请阅读这篇文章:Bad CaRMa

    【讨论】:

    • 如果是 XML,我仍然可以搜索它的内容,不是吗?我还添加了另一个问题的 EDIT :) 到目前为止谢谢。
    • 感谢 Re's 很遗憾,我现在没有精力研究并翻译所有内容 - 稍后会阅读并发布:)
    • 另请参阅我的演示文稿:slideshare.net/billkarwin/…
    • @Bill - 搜索的解决方案不会类似于 - XML 中 BLOB/TEXT 中的模块结构和另一行称为“单词”、“标志”、“标签”或“内容”的搜索?顺便说一句,我可能会投票给你,不是因为你是唯一的人,而是因为你的反应很棒。
    • 当然,您可以使用另一列(而不是行)来搜索要搜索的单词,如果这样可以让您找到所需的文档。然后在该“单词”列上使用 FULLTEXT 索引。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-31
    • 2010-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多