2

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

我几乎没有被数据库设计/存储内容的整个想法所困扰。

1.,在大多数网站上(根据我的经验)最痛苦的是具有准相同布局/骨架的页面,具有不同的信息 - 例如标题,图片和信息集 - 但是,在 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_us, content_it, category_id, parent_id.

我想我可以将结构描述和内容本身(注意??? ?)保存为 XML 或 CSV,但也许我正在尝试重新发明轮子,而对此的答案隐藏在我没有的一些设计模式中' t调查了。

希望我有任何意义,并会得到一些答复 - 给我你的意见,优点,缺点......或者让我下地狱。谢谢

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

4

1 回答 1

1

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

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


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

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

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

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


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

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

于 2010-01-25T22:13:05.110 回答