2011-06-15 73 views
1

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

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,如果我想在3和4之间插入,那么order_id可以简单地是'3a'。问题在于,在我的应用程序代码中,使用数字索引来遍历下一个和前一个句子将是一个问题。

是否有其他的选择?

回答

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 

这种方式,它是很容易恢复的内容的文章,在历史上一点,看看哪些用户有什么做的修改等