规范化 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是外键回Tagtable.

您还可以在 (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”。