【问题标题】:database structure for general and specific data一般和特定数据的数据库结构
【发布时间】:2013-01-17 21:16:02
【问题描述】:

我正在尝试对数据库布局进行概念化,但我有一个“理论”问题。我有一个系统,例如:

  • 用户
  • 书籍

这些书不是唯一的,例如 Alice、Bob 和 Carl 都可以拥有一本《白鲸记》。此外,每个用户可以拥有许多书籍。这是一个简单的多对多关系,我非常了解。但是,我应该在哪里存储有关 Alice 的特定 Moby Dick 副本的信息?

我最终希望能够做到以下几点: - 查找所有拥有 Moby Dick 副本的用户 - 更改有关一本书的单个“实例”的信息:Alice 的 Moby Dick 副本被“借出” - 更改/添加一本书的信息(即每个人的副本):将出版商信息添加到 Moby Dick。

我看不出如何有效地进行布局。我可以有 1 个书籍表,1 个用户表,然后为 n 个用户提供 n 个表,每个表都包含有关他/她的收藏的信息。当我需要找到每一个有白鲸记的副本时,这似乎会很慢。任何建议都会有所帮助。

【问题讨论】:

    标签: database-design


    【解决方案1】:

    假设它是一个图书馆数据库,我将从以下设计开始。 表格:

    1. 用户(借书的人)
    2. 书籍(关于书籍、书名、作者等的基本信息......此级别的信息是合乎逻辑的)
    3. 书本(这个存储物理印刷书籍信息)
    4. 用户图书借阅(谁借了哪本图书)

    这种表结构允许,

    1. 一本书可以有许多书本,并且每一本都可以被识别。
    2. 一个用户可以拥有多本书

    为了更好地理解这里是一些伪 SQL 代码。

    “查找所有拥有 Moby Dick 副本的用户”

    SELECT users.user_name
      FROM users u, "user book loans" ubl, "book copies" bk, books b
     WHERE 1 = 1
       AND b.book_name = "Moby Dick"--find book
       AND b.book_id = bk.book_id--find copies of that book
       AND bk.book_copy_id = ubl.book_copy_id--find loan info for the book copy
       AND ubl.user_id = u.user_id--find user who borrowed the copy
    

    我认为上面的查询解释了表结构,您可以添加属性,如出版日期到书籍副本,或有关书籍作者的信息,用户书籍借阅的一些日期字段以跟踪使用的时期

    【讨论】:

    • 如果我理解正确的话,#2 和#3 不能在同一张桌子上吗?我将使用 Ruby/Rails/ActiveRecord,因此 SQL 代码很有帮助,但对我来说并不完全清晰 =P。一位朋友使用这种方法提出了与您基本相同的解决方案guides.rubyonrails.org/…
    • books 表是您按标题/名称对书籍进行分组的地方,正如您所说,书籍副本是单个“实例”(一本书可能有多个副本)。这是您的设计,您将决定什么是最适合您的。如果它是为了教育目的,那就开始吧,当你遇到因为你的设计而出现的问题/困难时,改变你的设计并迭代,练习是好的:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 2010-10-30
    • 2016-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多