出于自学习目的,我正在尝试创建一个简单的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.abc
,onlinelist.pqr
,onlinelist.xyZ
,那么搜索不需要查看不相关的条目?但是,我认为拥有名为onlinelist.abc
或onlinelist.xyz
的表格并没有多大意义。我的设计已经很好了吗?
答案 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)
+----+--------+----------+