分成多个表还是将它们放在一个表中?

时间:2013-03-12 08:57:19

标签: database-design

出于自学习目的,我正在尝试创建一个简单的Web应用程序,该应用程序创建一个TODO列表,其中每个列表都有一个唯一的URL。我目前使用以下数据库设计。 onlinelist.list表存储每个列表的URL和密码。 onlinelist.item存储每个列表中存储的项目。

onlinelist.list                   onlinelist.item
+----+-----+-------------+        +----+---------+-----+
| ID | URL |  Password   |        | ID | Content | URL |
+----+-----+-------------+        +----+---------+-----+
|  1 | abc | rfk49gh34   |        |  1 | apple   | abc |
|  2 | pqr | 12345       |        |  2 | banana  | xyz |
|  3 | xyz | password123 |        |  3 | milk    | pqr |
+----+-----+-------------+        |  4 | beef    | abc |
                                  |  5 | egg     | abc |
                                  |  6 | pasta   | xyz |
                                  |  7 | lemon   | pqr |
                                  |  8 | carrot  | xyz |
                                  +----+---------+-----+

让我担心会在onlinelist.item表中看到一些重复的网址。要获取存储在“abc”中的列表的所有列表项,它需要遍历表的所有元素并找到URL等于“abc”的那些元素。 (我假设这是SELECT语句的工作原理。)删除列表项也需要执行此搜索。

如果我为每个列表创建一个单独的表,即onlinelist.abconlinelist.pqronlinelist.xyZ,那么搜索不需要查看不相关的条目?但是,我认为拥有名为onlinelist.abconlinelist.xyz的表格并没有多大意义。我的设计已经很好了吗?

1 个答案:

答案 0 :(得分:0)

在设计物体时,你应该看看它们之间的关系。从您的示例中我看到两个对象:

包含属性的TODO列表:

  • 编号
  • 地址
  • 密码

带有属性的TODO项目:

  • 编号
  • 内容

您商品的网址属性似乎不是绑定到商品,而是绑定到商品所属的列表。

如果从关系角度看这个,你可以说TODO项目“属于”TODO列表,或者说TODO列表中有TODO项目的集合。

为此,列表和项目实体之间有1:N映射(1个列表有N个项目,1个项目属于1个列表)。

要记录此关系,您可以通过以下方式修改TODO项目表:

onlinelist.list                   onlinelist.item
+----+-----+-------------+        +----+---------+--------+
| ID | URL |  Password   |        | ID | Content | ListId |
+----+-----+-------------+        +----+---------+--------+
|  1 | abc | rfk49gh34   |        |  1 | apple   |   1    |
|  2 | pqr | 12345       |        |  2 | banana  |   3    |
|  3 | xyz | password123 |        |  3 | milk    |   2    |
+----+-----+-------------+        |  4 | beef    |   1    |
                                  |  5 | egg     |   1    |
                                  |  6 | pasta   |   3    |
                                  |  7 | lemon   |   2    |
                                  |  8 | carrot  |   3    |
                                  +----+---------+--------+

如果您想在多个列表上共享项目,则只能使用两个表来执行此操作,但您必须创建映射表。

在这种情况下,您将从onlinelist.item表中保留ListId并创建一个新的

onlinelist.mapping         
+----+--------+----------+ 
| ID | ListId |  ItemId  | 
+----+--------+----------+ 
|  1 |    1   |     1    | 
|  2 |    1   |     2    | 
|  3 |    2   |     1    | (with more mapping going on)
+----+--------+----------+