【问题标题】:One large database table for my "list" or a new table for each "list"我的“列表”一个大型数据库表或每个“列表”的一个新表
【发布时间】:2011-04-30 08:21:24
【问题描述】:

我正在尝试创建一个数据库系统,用户可以在其中创建列表,并且他们的朋友(他们允许列表访问)可以添加到列表中。

我正在尝试绘制此架构,但无法在以下各项之间做出决定:

列表 带属性: listid, entry-number, entry, user-id

其中 listid 是要更改的列表,entry-number 是该条目在列表中的编号(因此列表中的第一项是条目 0),entry 是列表中的条目,user-id 是添加条目的用户

VS

具体列表 为每个带有属性的列表制作一个特定的表 entry-number, entry, user-id

似乎第二个选项让我们在找到表格后更容易获取信息/更改列表,而第一个选项更容易理解。

我刚刚进入数据库,所以我想正确选择架构。

谢谢!

【问题讨论】:

  • 我不确定,但第二个选项没有意义:它说您将为每个列表创建一个表,这意味着您每次向数据库添加数据时都会更改架构。也许我不只是明白。

标签: database schema


【解决方案1】:

第一个选项更易于维护和规范化。查询此选项并创建使用该列表的应用程序会更容易。

【讨论】:

  • 我的问题是,如果我有很多用户访问一个列表,这会不会比为每个列表创建一个单独的表效率更低(而且更慢?)?这是可扩展的吗?
  • 创建一个必须为每个用户创建一个新表的应用程序将更加困难。例如,假设您想找到列表最长的用户。你会怎么查询呢?使用单个表不会降低效率。数据库系统正是针对这种类型的场景进行了优化。
  • 当您有 10000 个用户时,您的数据库中是否会有 10000 个表?这不健康。
  • 是的,这是有道理的。谢谢!
【解决方案2】:

据我所知,您应该有两张桌子。一个保存用户信息,一个保存列表信息。 用户将具有 userID (PK),您的 List 表将具有 listID (PK) 和一个作为 FK 的 userID,以引用列表所属的用户。所以,是的,你的第一选择:) 总帐

例如:

User
userID(PK) | username | etc
--------------------------
1 | Bob | etc
2 | Nick | etc


Lists
listID(PK) | userID(FK) | date_entered | entry
----------------------------------------------
1 | 2 | 1/2/2011 | blah blah
2 | 2 | 2/1/2011 | blah blah
3 | 1 | 2/3/2011 | blah blah
4 | 2 | 2/6/2011 | blah blah
5 | 1 | 3/1/2011 | blah blah

//you should know the userID for the user you are looking up list info for (C#)
query = "select * from Lists where userID = " + userID.ToString() + " ORDER BY date_entered DESC";

【讨论】:

  • 对于列表中的每个条目,我需要跟踪创建该条目的用户。您的设置似乎没有更快。
  • @mamontazeri 您需要将列表项表与 euser 表连接起来,您可以获得用户的详细信息。
  • 我解释它的方式是我需要将列表拆分为这 2 个表: List list-id |条目号 |条目和,列表用户列表 ID |条目号 | user-id 这似乎没有太大的不同。我是否误解了您将其正常化的方式?谢谢!
  • 你应该把 entry-number 拿出来。如果您打算删除列表等,则很难跟踪它。如果您想跟踪条目号,请创建 datetime 列并按日期对查询进行排序。
  • 谢谢尼克,entry-number 只是为了排序,所以这似乎更快。
猜你喜欢
  • 1970-01-01
  • 2011-11-25
  • 2023-03-11
  • 2020-10-22
  • 1970-01-01
  • 2022-11-18
  • 1970-01-01
  • 2018-09-14
  • 2017-01-12
相关资源
最近更新 更多