我该如何改进这个数据库设计?

时间:2011-11-25 20:38:58

标签: ruby-on-rails database-design activerecord

我正在尝试为我当前的项目设计数据模型,但我遇到了麻烦。产品所有者希望拥有用户,搜索,文档和标签。这是迄今为止似乎众所周知的事情:

  • 用户有搜索 - (这些不是数据库搜索,它们是返回一堆文档的全文搜索)
  • 搜索有文档< - 但是这不需要建模。搜索结果会随着时间的推移而改变。
  • 用户拥有文档 - 他们之前从任何搜索中看到的任何文档
  • 标签是文字字符串
  • 用户可以使用任意数量的标记标记文档,但其他用户将无法看到他们的标记

我在这里试图管理两个问题:

  1. 每当用户进行搜索时,我都需要根据以前是否看过它们来不同地标记返回的文档。 如何?从搜索中收集文档(一次返回10个)然后为属于该用户的所有文档发出另一个 SQL查询是否合理哪个有搜索的doc_ids之一?似乎很难。
  2. 由于用户可以为文档提供多个标记,并且由于其他用户无法看到它们,我如何在数据库中表示它?我如何合理地查询它?我认为属于用户的文档由连接表 - UserDocuments表示。然后几个Tags属于UserDocuments。 但是,我如何在搜索结果中显示标签?在我看来,这涉及到我发布搜索,查找我之前看过的文档,然后找到哪些文档标记然后再次为每个文档命中数据库并收集它们的标记。这看起来很极端,不是吗?
  3. 可能让我理解的一件事是我正在考虑使用Ruby on Rails ActiveRecord ORM。我最终将不得不实现我在Rails中找到的任何解决方案。

2 个答案:

答案 0 :(得分:2)

一种可能的设计:

   User               
  1|  \1   
   |   \     
   \   N\      
    \   Search                    Document
     \      \1                    1/    /1
      \      \                    /    /
       \     N\                  /M   /
        \   Search-Returns-Document  /     
         \                          /
          \                        / 
           \N                    M/
            User--Views--Document           Tag
                   1\                      1/
                     \                     /
                      \N                  /M  
                   User-Marks-Document-With-Tag

答案 1 :(得分:0)

希望这会有所帮助:

  1. 有一个包含user_id,document_id等的Documents_Viewed表。然后在检索搜索结果时,将用户和文档上的已查看表加入,这将告诉您是否已阅读它。

  2. 我会有另一个包含user_id,document_id,tag的表Document_Tags,因为你提到的标签是用户相关的

  3. 示例理论查询将是:

    SELECT * FROM Docuemnts d
             LEFT JOIN Document_Viewed dv ON (dv.document_id = d.id AND dv.user_id= ?)
             LEFT JOIN Document_Tags dt   ON (dv.document_id = d.id AND dv.user_id= ?)
             WHERE (search_criteria)
    

    不确定这对你有帮助吗