【发布时间】:2022-01-12 12:08:57
【问题描述】:
在我的应用中,用户可以发布可能包含文本、标题、图像等的帖子。
将这些存储在数据库中的正确方法是什么?我可以想到两种可能的方法:
第一种方法
在posts表中为一个帖子存储多行数据,如下所示:
| post_data_id | post_id | data_type | data |
|---|---|---|---|
| 1 | 1 | 1 | Sample Text |
| 2 | 1 | 2 | (Image Link) |
| 3 | 1 | 1 | Another Text |
| 4 | 1 | 3 | (Audio Link) |
其中data_type 是datatypes 表的外键,其中1 是示例文本,2 是图像链接,3 是音频文件的链接。
这样,为了检索单个帖子,我只会SELECT 属于特定post_id 的所有行。
第二种方法
以某种方式将帖子数据编码为如下的 HTML 之类的语言,并将其保存到 posts 表中的单行中:
<Text>Sample Text</Text><Image>Image Link</Image><Text>Another Text</Text><Audio>Audio Link</Audio>
通过这种方式,用户必须不能发布包含这些特定标签的文本,这正是让我质疑这种方法的原因。在将文本发送到数据库之前仅检查文本是否包含标签是否足够安全?
【问题讨论】:
-
第二个是一个看起来更花哨的分隔列表,因此它违反了 1NF,因此不应使用。另见"Is storing a delimited list in a database column really that bad?"(剧透:是的。)。
标签: mysql sql database database-design