规范化 SQLite 数据库中的标签 table
Normalising a tags table in a database for SQLite
所以我正在学习如何使用 SQLite 创建数据库,并且我正在努力尝试在供应商标签和供应商标签名中用逗号分隔值分隔字符串,然后将标签编号与标签名称对齐。
假设每一行的 vendorid 从 1、2、3 等递增。
这是一个架构
CREATE TABLE unnormalized(
vendor_tag varchar(200),
vendor_tag_name varchar(200),
vendor_id int
);
INSERT INTO unnormalized
VALUES
('5,8,30,24','Burgers,Desserts,Fries,Salads',1),
('5','Burgers',2),
('8,42','Desserts,Mexican',3),
('1,5,30,16','American,Burgers,Fries,Sandwiches',4),
('1,5,30,16','American,Burgers,Fries,Sandwiches',5);
您图片中的列名并未描述列内容。
首先,我会定义一个 Vendor
table:
Vendor
------
VendorID
VendorName
...
其中 VendorID
是一个自动递增的整数盲主(集群)键,VendorName
是供应商的名称。其他供应商属性将属于此 table.
编辑添加:您的图片中没有任何供应商,所以让我们来制作几个供应商。
Vendor table
VendorID | VendorName
-------- | ----------
1 | McDonald's
2 | IHOP
接下来,我会定义一个Tag
table.
Tag
---
TagID
TagName
其中 TagID
是一个自动递增的整数盲主(集群)键,TagName
是标签的名称。
编辑添加:标签 table 的内容如下所示。
Tag table
TagID | TagName
----- | -------
1 | American
2 | Arabic
3 | ?
4 | Breakfast
5 | Burgers
...
每个标签一行。
最后,由于 Vendor 和 Tag 之间的关系是多对多的,我将定义一个 VendorTag
连接点 table。
VendorTag
---------
VendorTagID
VendorID
TagID
Created Timestamp
其中 VendorTagID
是自动递增整数盲主(集群)键,VendorID
是返回 Vendor
table 的外键,TagID
是外键回Tag
table.
您还可以在 (VendorID, TagID)
上定义一个唯一索引,这样您就可以相当容易地检索供应商的标签。如果您还想检索标签的供应商,您可以在 (TagID, VendorID)
.
上创建另一个唯一索引
编辑添加:这是 VendorTag table 的某些行可能的样子。
VendorTag table
VendorTagID | VendorID | TagID | Created Timestamp
----------- | -------- | ----- | -------------------
1 | 1 | 4 | 2020-12-27 16:44:10
2 | 1 | 8 | 2020-12-27 16:44:10
3 | 1 | 10 | 2020-12-27 16:44:11
4 | 1 | 91 | 2020-12-27 16:44:11
每个 table 的每一列都包含一个且只有一个值。这是database normalization的要点之一。数据库中没有重复信息是数据库规范化的另一个重点。
创建一个 table“vendor_tags”,包含两列,id 和 name。在那个 table 你会有像
这样的行
5,Burgers
8,Desserts
...
“id”列将用作 table 的主键。
您的示例中没有“vendor_id”。
所以我正在学习如何使用 SQLite 创建数据库,并且我正在努力尝试在供应商标签和供应商标签名中用逗号分隔值分隔字符串,然后将标签编号与标签名称对齐。
假设每一行的 vendorid 从 1、2、3 等递增。 这是一个架构
CREATE TABLE unnormalized(
vendor_tag varchar(200),
vendor_tag_name varchar(200),
vendor_id int
);
INSERT INTO unnormalized
VALUES
('5,8,30,24','Burgers,Desserts,Fries,Salads',1),
('5','Burgers',2),
('8,42','Desserts,Mexican',3),
('1,5,30,16','American,Burgers,Fries,Sandwiches',4),
('1,5,30,16','American,Burgers,Fries,Sandwiches',5);
您图片中的列名并未描述列内容。
首先,我会定义一个 Vendor
table:
Vendor
------
VendorID
VendorName
...
其中 VendorID
是一个自动递增的整数盲主(集群)键,VendorName
是供应商的名称。其他供应商属性将属于此 table.
编辑添加:您的图片中没有任何供应商,所以让我们来制作几个供应商。
Vendor table
VendorID | VendorName
-------- | ----------
1 | McDonald's
2 | IHOP
接下来,我会定义一个Tag
table.
Tag
---
TagID
TagName
其中 TagID
是一个自动递增的整数盲主(集群)键,TagName
是标签的名称。
编辑添加:标签 table 的内容如下所示。
Tag table
TagID | TagName
----- | -------
1 | American
2 | Arabic
3 | ?
4 | Breakfast
5 | Burgers
...
每个标签一行。
最后,由于 Vendor 和 Tag 之间的关系是多对多的,我将定义一个 VendorTag
连接点 table。
VendorTag
---------
VendorTagID
VendorID
TagID
Created Timestamp
其中 VendorTagID
是自动递增整数盲主(集群)键,VendorID
是返回 Vendor
table 的外键,TagID
是外键回Tag
table.
您还可以在 (VendorID, TagID)
上定义一个唯一索引,这样您就可以相当容易地检索供应商的标签。如果您还想检索标签的供应商,您可以在 (TagID, VendorID)
.
编辑添加:这是 VendorTag table 的某些行可能的样子。
VendorTag table
VendorTagID | VendorID | TagID | Created Timestamp
----------- | -------- | ----- | -------------------
1 | 1 | 4 | 2020-12-27 16:44:10
2 | 1 | 8 | 2020-12-27 16:44:10
3 | 1 | 10 | 2020-12-27 16:44:11
4 | 1 | 91 | 2020-12-27 16:44:11
每个 table 的每一列都包含一个且只有一个值。这是database normalization的要点之一。数据库中没有重复信息是数据库规范化的另一个重点。
创建一个 table“vendor_tags”,包含两列,id 和 name。在那个 table 你会有像
这样的行5,Burgers
8,Desserts
...
“id”列将用作 table 的主键。
您的示例中没有“vendor_id”。