【问题标题】:How can I improve this database design?如何改进这个数据库设计?
【发布时间】:2011-11-26 06:20:30
【问题描述】:

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

  • 用户有搜索 -(这些不是数据库搜索,它们是返回一堆文档的全文搜索)
  • 搜索有文档
  • 用户拥有文档 - 他们之前通过任何搜索看到的任何文档
  • 标签是文本字符串
  • 用户可以使用任意数量的标签标记文档,但其他用户将无法看到他们的标签

我想在这里解决两个问题:

  1. 每当用户进行搜索时,我都需要根据以前是否见过返回的文档来不同地标记它们。 如何? 只从搜索中收集文档(一次将返回 10 个)然后对属于用户的所有文档发出 另一个 SQL 查询是否合理哪个具有搜索中的 doc_id 之一?看起来很笨拙。
  2. 既然一个用户可以给一个文档几个标签,而其他用户看不到它们,我如何在数据库中表示它?如何合理查询?我认为属于用户的文档由连接表 - UserDocuments 表示。然后有几个Tags属于UserDocuments。 但是我如何在搜索结果中显示标签?在我看来,这涉及到我发出搜索,找到我以前看过的文档,然后找到其中哪些有标记,然后为这些文档中的每一个再次访问数据库并收集它们的标记。这看起来很极端,不是吗?

在这里可能会混淆我的理解的一件事是,我正在考虑使用 Ruby on Rails ActiveRecord ORM。我最终将不得不实施我在 Rails 中找到的任何解决方案。

【问题讨论】:

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


    【解决方案1】:

    一种可能的设计:

       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 是迄今为止最好的“ascii 字符”图表。另外还因为它是带有阴影的灿烂笑容:)
    • 所以这基本上是我的想法,除了我不必为搜索、文档和 SRD 建模。但似乎我仍然需要进行大量查询才能取回填充搜索结果页面所需的信息。
    【解决方案2】:

    希望这会有所帮助:

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

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

    示例理论查询将是:

    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)
    

    不确定这是否对您有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-09
      • 1970-01-01
      • 2013-07-09
      • 2014-01-03
      • 1970-01-01
      • 2011-01-27
      • 2011-10-16
      • 2021-12-03
      相关资源
      最近更新 更多