对于动态内容构建器,将HTML保存到MySQL数据库中是否是一种好方法?

时间:2019-03-04 19:18:24

标签: html mysql database

我有一个新项目即将出现,其中我必须从头开始创建一个自定义内容编辑器(我将使用Laravel和Vue JS)。每个条目将具有由blocks定义的结构,其中具有RTF内容fields。这将是所需布局的一个示例:

Three rows of content

我的问题是:如何在数据库中创建这些block_types(标题,副标题,三列行...)和fields?我认为使用占位符将HTML structure字段保存到block_types数据库表中可以解决问题。

HTML长文本保存到数据库中,进入“块类型”的“结构”字段

<div class="row">
    <div class="col-4">///// CONTENT</div>
    <div class="col-4">///// CONTENT</div>
    <div class="col-4">///// CONTENT</div>
</div>

然后我将内容动态地按顺序添加到/// CONTENT占位符中。 看起来很麻烦,所以我想我可能从一开始就很棘手,有什么建议吗?

PS:这是我到目前为止的数据库结构:

DB structure

1 个答案:

答案 0 :(得分:2)

将HTML保存到数据库几乎从来不是一个好主意。发生这种情况的一次是CMS,它提供了一个富文本界面,用户可以在其中使用简单的标签(粗体,列表等)来设置文本样式。

将标记存储在数据库中的根本问题是,由于它是硬编码在数据库中的,因此您会迷惑它的结构。

例如,如果您有一天决定确定存储的div标签之一应该具有某个类,该怎么办?或数据属性。您必须更新每一行,或者更糟糕的是,它仍然会通过JS影响DOM中的更改,这意味着视图中的结果HTML确实与您存储的HTML不匹配。

存储标记还意味着以所有的空间存储超出您可能需要的数据。

更好的方法是定义一个块系统,其中有一个专用的块表,该表通过外键引用父UI表。所以可能是这样的:

表1:UI(根据您的示例,界面,标签的集合)

----------------------------
| id | ...other fields ... |
----------------------------

表2:阻止

---------------------------------
| id | ui_id | parent_id | type |
---------------------------------

表2将是递归的,因为它将存储代表父容器的块和子容器中的子块:

  • 外部块(容器)将通过ui_id与UI ID相关
  • 子块将通过parent_id与父块相关

对于type,您可以在此处采用这种方法并运行它。也许这是一个字符串,表示应该是哪种类型的块(例如“全宽”,“ grid-x3”等)。

然后,您当然可以通过类似PHP或JS的方式在视图中呈现此数据,以再次递归以确保获得所有嵌套级别。

因此,让我们运行一些示例数据。现在,我们将仅使用一种“类型”的块,即简单的“ div”。

UI表:

----------------------------
| id | ...other fields ... |
----------------------------
| 1  | ...                 |
----------------------------

块表:

---------------------------------
| id | ui_id | parent_id | type |
---------------------------------
| 1  | 1     | null      | div  |
---------------------------------
| 2  | 1     | 1         | div  |
---------------------------------
| 3  | 1     | 2         | div  |
---------------------------------

这表示嵌套块的三个级别,即在渲染时:

---------------------
| ----------------- |
| | ------------- | |
| | |           | | |
| | ------------- | |
| ----------------- |

希望能为您提供一个起点。