我有一个应用程序,允许管理员上传文章并与许多用户共享以进行编辑。然后将该文章分解为句子,这些句子将作为单独的行存储在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之间插入。问题是在我的应用程序代码中,使用数字索引遍历下一个和前一个句子将是一个问题。
还有其他选择吗?
答案 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
通过这种方式,可以很容易地将文章内容恢复到历史记录中的前一个点,以查看哪些用户进行了哪些修改等等