协作文章编辑器的良好表格结构

时间:2011-06-15 04:27:57

标签: mysql database database-design relational-database

我有一个应用程序,允许管理员上传文章并与许多用户共享以进行编辑。然后将该文章分解为句子,这些句子将作为单独的行存储在MySQL DB中。每个用户可以一次编辑一篇文章句子。如何构建数据库以允许管理员调整文章句子(合并,移动,删除,编辑,添加)并仍然保持用户与文章句子的关系的完整性? 这是基本结构:

article_sentences
---------------
-id (auto_increment)
-article_id (FK)
-paragraph_id
-content

user_article_sentences
---------------
-user_id (FK)
-article_id (FK)
-article_sentence_id (FK)
-user_content

我看到的一个问题是article_sentence ID的变化。如果管理员移动文章,如果我们希望文章内容的顺序正确,则ID需要随着paragraph_id的变化而改变。要解决这个问题,我们可以添加一个article_sentence_order列吗?这样,id永远不会改变,但内容的顺序由article_sentence_order列决定。

合并和删除怎么样?这些也会导致一些问题,因为不同ID的碎片将开始发生。

有关新架构设计的任何想法有助于解决这些问题吗? Google Docs这样的应用如何处理此类问题?

修改

解决移动不同句子的问题。我们可以使用一个名为order_id的新列,它可以是varchar或int。一些权衡:如果是int,那么我将不得不将后续句子的order_id增加为自身的加1。如果使用varchar,order_id可以简单地类似于'3a',如果我想在3和4之间插入。问题是在我的应用程序代码中,使用数字索引遍历下一个和前一个句子将是一个问题。

还有其他选择吗?

1 个答案:

答案 0 :(得分:1)

如果仅保留完整版本的内容,每个记录的版本号,那么您将拥有所编辑文章的完整历史记录以及修改后的文章?

User:

 - id
 - name 

User_article:

 - id
 - user_id (fk on user, this is the current editor)
 - article_id
 - version_number
 - article_content (the full content of the article)

Article:

 - id
 - created_date
 - user_id (the creator, or main owner )
 - category_id

通过这种方式,可以很容易地将文章内容恢复到历史记录中的前一个点,以查看哪些用户进行了哪些修改等等