繁体   English   中英

mysql创建发布并将图像和段落存储在单个表或多个表中

[英]mysql create post and store images & paragraphs in single table or multiple table

我尝试建立一个包含图像和段落的文章页面。

我的问题是我应该为图像和段落创建2个表格吗?

或创建一个表并将图像和段落存储在一个列中?

*(图片和段落从上到下的顺序)

1.多表

//文章表

id title
1  first post

// image表(易于输出,但是db会很大)

id article_id src
1  1          abc.jpg

//段落表

id article_id text
1  1          this is first paragraph...

2.单表(在db内存储标签,输出会有xss问题)

//文章表

id  content
1  <p>feff.....</p><img... /><p>efefef</p><img.../>

您的第一种方法的问题在于它没有顺序的概念。 除非您只有一个图像和一个段落以特定顺序排列,否则无法保证正确的顺序。 完成这些任务的一种更好的方法是将有类似articlesarticle_contents

//文章

id, title

// article_contents

id, article_id, content_type, body, order

我想您也可能没有order字段,而是依靠自动增量ID,但是我认为最好对这些内容更明确。

因此,在渲染模板时,您可以执行类似操作。 (这都是伪代码)

<h1>
    <?= $article->title; ?>
</h1>

<?php
foreach($article->content as $content) {
    // this would be better as a class constant
    if ($content->content_type === 'image') {
        // have a class to handle rendering of images
        echo \Content\Image::render($content->body);
    }

    if ($content->content_type === 'paragraph') {
        // have a class to handle rendering of content, this output will likely need to be purified (see below)
        echo \Content\Paragraph::render($content->body);
    }
}
?>

有很多方法可以做到。

您提到的另一个选项确实有问题,但是您可以通过两种方式之一来处理XSS问题。

  1. htmlentities(),但您会丢失所有格式()。
  2. HTML Purifier,这将使您可以将某些标签(如粗体,斜体和段落)列入白名单。 对于第一种解决方案,您也可能需要这样做,因为没有任何格式的文章阅读起来很糟糕。

基于评论的更新:

关于您的第一条评论,如果ID位于两个单独的表中,则不能依赖ID,它可能会起作用,但这是一个非常脆弱的解决方案,没有提供我能想到的任何好处。

至于净化src标记,您只需配置HTMLpurifier即可验证src标记,从外观上,您可以使用指令Core.RemoveInvalidImg HTMLPuirifier内置了很多这些选项,功能非常强大。 有关更多选项/文档,请参见下面的链接。

https://github.com/GordonLesti/Lesti_Blog/tree/master/lib/HTMLPurifier/ConfigSchema/schema

http://htmlpurifier.org/docs/enduser-customize.html

进一步更新:

关于性能。 这就是所谓的“要解决的好问题”。

选择文章时,您可以缓存结果HTML并将其提供,当数据不经常更改时,无需打扰数据库。

插入新文章时,您只需要等待并围绕它构建即可。 您可以执行诸如更新UI和异步更新数据库之类的操作。 让用户了解最新信息,这是最重要的。

更新文章时,请不要忘记使缓存无效。

最主要的是, 这不是您现在需要考虑的真正问题 现在,请放入一个缓存层,当您达到SO的大小时,您可以聘请专业人士来处理这种疯狂的事情。 请参阅下面的链接,这非常有趣。

http://nickcraver.com/blog/2013/11/22/what-it-takes-to-run-stack-overflow/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM