0

出于自学目的,我正在尝试创建一个简单的 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看到表格中重复的一些 URL 让我很担心。要获取存储在“abc”中的列表的所有列表项,它需要遍历表的所有元素并找到 URL 等于“abc”的那些元素。(我假设这是 SELECT 语句的工作方式。)删除列表项也需要执行此搜索。

如果我为每个列表(即onlinelist.abc, onlinelist.pqr, )创建一个单独的表onlinelist.xyZ,这样搜索就不需要查看不相关的条目,难道不是更有效吗?但是,我认为将表称为onlinelist.abcor并没有什么意义onlinelist.xyz。我已经有一个好的设计了吗?

4

1 回答 1

0

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

带有属性的 TODO 列表:

  • ID
  • 网址
  • 密码

具有属性的 TODO 项:

  • ID
  • 内容

您的项目的 URL 属性似乎没有绑定到项目,而是绑定到项目所属的列表。

如果从关系的角度来看,您可以说 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)
+----+--------+----------+ 
于 2013-03-12T09:12:41.197 回答