我有一个存储数千个书签的数据库,BM_Table表有以下列
Name Location
由于多个相同的名称具有不同的位置,并且多个不同的名称具有相同的位置。
有人建议我将关系规范化以避免重复值。
但正如您所见,无属性Name
或Location
可用作主键,只有候选键形成
那么如何规范表格呢?
请详细解释。
答案 0 :(得分:2)
如果您的表格与此类似(猜测数据类型)
create table your-table-name
name varchar(10) not null,
location varchar(10) not null,
primary key (name, location)
);
那时它已经在5NF了。
有些人不喜欢文字;他们宁愿用id号替换字符串。 (用id号替换字符串与规范化无关。)但是每个使用这些表的查询都需要至少一个连接 - 通常是几个 - 来从id号中恢复文本。
答案 1 :(得分:0)
我想无论谁向你建议,都意味着要创建三个表:
tbl_name (name_id, name)
tbl_location (locaiton_id, location)
tbl_name_location (name_id, location_id)
并使用tbl_name_location
将其他两个绑定在一起。
这种方法会创建一些“人工”ID,您只能将一个表与另一个表关联起来。只要您为多个名称和位置条目节省一些空间,问题就是:这对您有益吗?如果不知道如何使用这个数据库,很难说清楚。标准化后,每个请求都需要一些连接,所以我认为基准测试和分析将是确定是否通过规范化获得任何东西的最佳方法。
答案 2 :(得分:-1)
表1: 填充NameID 名称
表2: LocationID 位置
表3: NameToLocationID 填充NameID LocationID
在关系数据库管理系统(RDBMS)的设计中,组织数据以最小化冗余的过程称为规范化。数据库规范化的目标是分解与异常的关系,以产生更小,结构良好的关系。规范化通常涉及将大表分成较小(和较少冗余)的表并定义它们之间的关系。目标是隔离数据,以便可以在一个表中添加,删除和修改字段,然后通过定义的关系在数据库的其余部分传播。