为未来的观众编辑:除了接受的答案,我找到了一些非常好的信息here 。
我有一个带有单个表的数据库,用于显示网站上的库存(RV)。它存储了典型的信息:年份,品牌,型号等。我最初使用6个额外的列来存储"特殊功能",但我不喜欢对哪些选项有如此严格的限制可以列出。由于我从未与一张桌子混在一起,我的直觉就是只添加24个左右的列来覆盖所有内容,但我头脑中的一些东西告诉我可能有更好的方法。那么我什么时候决定N列太多了?这些列中的数据通常不是唯一的。
(抱歉蹩脚的图表)
当前的表格设计:
-----------------------------------------------------------------------
| id | year | make | model | price | ft_1 | ft_2 | ft_3 | ft_4 | ft_5 |
-----------------------------------------------------------------------
| | | | | | | | | | |
-----------------------------------------------------------------------
可能更好的设计:
table #1
------------------------------------
| id | year | make | model | price |
------------------------------------
| | | | | |
------------------------------------
table #2
---------------------------------------------
| unique_id(?) | feature | unit_ref |
---------------------------------------------
| 0 | "Diesel Pusher" | 2,6,14 |
---------------------------------------------
我觉得第二张表的奖励可能是我可以更轻松地传播包含所有先前输入的功能的下拉列表,以加快向库存添加新单位。
这是正确的方法,还是我应该添加更多列并满足?
感谢。
答案 0 :(得分:2)
信不信由你,最好的选择可能是添加第三个表。
由于 rvs 表中的每条记录都可以链接到功能表中的多个行,并且每个功能可以对应多个< strong> rvs ,你有一个多对多的关系,这在关系型dbms中很难维护。通过添加第三个“交集”表,您可以将其转换为一对多关系,这可以由dbms以声明方式强制执行。
您的表格结构将变为类似
rvs
------------------------------------
| id | year | make | model | price |
------------------------------------
| | | | | |
------------------------------------
features
--------------------------
| id | feature |
--------------------------
| 1192 | "Diesel Pusher" |
--------------------------
rv_features
----------------------
| rv_id | feature_id |
----------------------
| | |
----------------------
你如何利用这个?假设您想记录2016 Travelmore CampMaster配备25kW柴油发电机的事实。您首先要将记录添加到rvs
--------------------------------------------------
| id | year | make | model | price |
--------------------------------------------------
| 0231 | 2016 | Travelmore | CampMaster | 750000 |
| 2101 | 2016 | Travelmore | Domestant | 650000 |
--------------------------------------------------
(请注意id
列中的值完全是任意的;其唯一目的是作为唯一标识记录的主键。它可以编码有意义的信息,但它必须是在其识别的记录的整个生命周期内不会改变的东西。)
然后在features
表中添加(或已经拥有)生成器:
--------------------------------
| id | feature |
--------------------------------
| 1192 | Diesel Pusher 450hp |
| 3209 | diesel generator 25kW |
--------------------------------
最后,您将rv与功能与rv_features
中的记录相关联:
----------------------
| rv_id | feature_id |
----------------------
| 0231 | 3209 |
| 0231 | 1192 |
| 2101 | 3209 |
----------------------
(我为每个表添加了一些其他记录以供上下文使用。)
现在,要检索2016 CampMaster的功能,请使用以下SQL查询:
SELECT r.year, r.make, r.model, f.feature
FROM rvs r, features f, rv_features rf
WHERE r.id = rf.rv_id
AND rv.feature_id = f.id
AND r.id = '2031';
获取
----------------------------------------------------------
| year | make | model | feature |
----------------------------------------------------------
| 2016 | Travelmore | CampMaster | diesel generator 25kW |
| 2016 | Travelmore | CampMaster | Diesel Pusher 450hp |
----------------------------------------------------------
要使用25kW发电机查看rv,请将查询更改为
SELECT r.year, r.make, r.model, f.feature
FROM rvs r, features f, rv_features rf
WHERE r.id = rf.rv_id
AND rv.feature_id = f.id
AND f.id = '3209';
Sherantha与A Quick-Start Tutorial on Relational Database Design的链接实际上看起来像表格设计和规范化的好介绍;你会发现它很有用。
答案 1 :(得分:0)
有一种东西calles“第三范式”它说没有唯一ID的所有东西都是独一无二的。这意味着您需要创建一年的表,一个用于为模型制作表的表等,以及一个表,您可以将所有这些ID组合到一个连接的数据集中。 但这并不总是实用的,我认为采取这种方式的最佳方式介于两者之间,比如经常重复使用的表格,但是不需要为具有唯一ID的价格提供额外的表格,我觉得这样做有点过头了
答案 2 :(得分:0)
我认为您更熟悉关系数据库设计会更好。 This是我之前发现的一篇简短而精彩的文章。
答案 3 :(得分:0)
根据您的情况,如果您不相信。功能列保持相同,然后不需要第二个表。如果有可能在将来的任何时间增加功能,那么您应该将表分成两个。 (RVS和功能)。然后创建一个识别RVS&amp;功能似乎有多对多的关系。所以我建议你使用三张桌子。