【问题标题】:Data Structure for One Entry with Unknown Number of Tags具有未知数量标签的条目的数据结构
【发布时间】:2020-12-19 04:57:19
【问题描述】:

这里是菜鸟。我正在尝试创建一个类或数据结构,其中每个条目都有一个唯一的名称和未知数量的描述性标签。我希望数据结构是我也可以轻松导出为某种常见格式的东西(我猜 CSV 无法满足我的要求,因为我认为我需要多个分隔符?)。

作为背景,我正在尝试定义这个数据结构,以便稍后我可以实现一种方法来提取每个条目并查看所有标签,以及能够实现一种搜索方式以查看哪些条目包含特定的标记。

这是我将要查看的原始数据示例,它具有一个唯一名称、一个非唯一数字和未知数量的非唯一标签。

Name: Jim
Age: 47
Descriptors (Tags): Fat, Tall, Wrinkly

Name: Bob
Age: 88
Descriptors: Sad

Name: Charlie
Age: 12
Descriptor: Tall, Ugly

【问题讨论】:

  • 既然您标记了 SQL,我假设您想使用关系数据库。您将创建一个包含姓名和年龄的 Person 表,以及一个指向 Person 行的 Descriptor 表,每个描述符对应一行。 Jim 将有三个 Descriptor 行,而 Bob 将有一个 Descriptor 行。维基百科文章Database Normalization 将提供更多详细信息。
  • 谢谢吉尔伯特!澄清一下,当您说 Jim 将有 3 个描述符行时,您的意思是 SQL 中的描述符表中的数据对于每个描述符都会有一行,而人名将在列中?因此,如果两个人有相同的描述符,那么他们将在同一行中使用该描述符?或者,您是说每一行只包含一个名称和一个描述符?我在示例中添加了第三个人来说明。
  • 嗯,我不知道有像 CONTAINS 命令这样的东西。因此,也许标签是文本,那么也许它们可以全部转储到一个单元格中,并在 SQL 环境中使用 CONTAINS 命令进行搜索。

标签: sql database csv


【解决方案1】:

这是我设计表格的方式。

Person Table

Person ID   Name       Birthdate
----------------------------------
        1   Jim       1973-10-02
        2   Bob       1932-06-02
        3   Charlie   2008-12-25


Descriptor Table

Descriptor ID   Person ID   Tag
--------------------------
            1           1   Fat
            2           1   Tall
            3           1   Wrinkly
            4           2   Sad
            5           3   Tall
            6           3   Ugly

两个表的 ID 字段都是一个自动递增的整数。它们也被称为盲键。除了将表连接在一起之外,它们没有其他意义。

两个表的 ID 字段都是主(集群)键。描述符表中的人员 ID 是指向人员表的外键。

每个人的姓名和出生日期出现一次。

当您想从 Descriptor 表中检索标签时,您需要指定 Person ID。您可以通过使用姓名或出生日期间接执行此操作。

SELECT Tag FROM Descriptor Table, Person Table
WHERE Person ID Descriptor = Person ID Person
AND Name = 'Bob'

以上不是有效的 SQL,但我希望你明白。

【讨论】:

  • 非常感谢!我用谷歌搜索了与 SQL 相关的“盲键”,但无济于事,但是说我可以不使用 Descriptor ID 列是否正确,或者它的存在是否有原因?我看到您提到了用于连接表的盲键(并了解这在 Person 表中的重要性),但不确定如何使用 Descriptor ID 来连接任何内容,但我想可能适用于其他情况。对吗?
  • 我在每张桌子上都放了盲键,即使它们目前没有使用。每个表都需要一个主键,而盲主键又短又唯一。
【解决方案2】:

在数据库中,您通常会使用至少两个表来执行此操作:

  • Users
  • UserTags

第二个表将有每个用户和每个标签一行。插入新标签就是在这个表中插入一行:

userId  tag
  1     tall
  1     ugly

如果标签必须来自指定列表,那么通常会有第三个表Tags 以确保标签有效。

某些数据库支持连续具有多个值的结构。数组或 JSON 数组也是一种可能的解决方案。但是,我将从数据库中的标准规范化表示开始。

【讨论】:

  • 谢谢!您能否澄清“第二个表每个用户和每个标签将有一行?您的意思是每一行将包含一个描述符和一个名称(即两个单元格)?或者您是说每一行将包含一个唯一的描述符和未知数量的名称?谢谢!
  • @rfii 。 . .好的。我想这对你来说还不够清楚。
  • 更新清除了!感谢您为我们这些菜鸟解释一切
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-07
  • 2016-12-15
  • 2011-05-14
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 2011-05-18
相关资源
最近更新 更多