如何在列上存储元数据

2023-11-25

假设您正在收集有关即将上映的超级英雄电影的内部信息,并且您的主电影表如下所示:

Table 1

Title              Director   Leading Male      Leading Female    Villain
--------------------------------------------------------------------------
Green Lantern      Kubrick    Robert Redford     Miley Cyrus     Hugh Grant  
The Tick          Mel Gibson  Kevin Sorbo        Linda Hunt    Anthony Hopkins

一般来说,这应该工作得很好,并且允许非常简单的查询以及行之间的比较。

但是,您希望跟踪每个数据事实的来源,以及发现该事实的记者的姓名。这似乎表明某种EAV像这样的表:

Table 2

Movie             Attribute            Value          Source          Journalist
----------------------------------------------------------------------------------
Green Lantern      Director           Kubrick         CHUD              Sarah
Green Lantern    Leading Male      Robert Redford     CHUD              James
Green Lantern   Leading Female      Miley Cyrus    Dark Horizons        James
Green Lantern      Villain           Hugh Grant       CHUD              Sarah
The Tick           Director          Mel Gibson       Yahoo            Cameron
...

虽然它可以轻松捕获我们想要的元数据,但会使查询变得更加困难。简单地获取一部电影的所有基本数据需要更多的时间。更具体地说,您必须在这里处理四行才能获取有关 Green Lantern 的四个重要信息,而在表 1 中它是一个单独的、封装良好的行。

所以我的问题是,鉴于我刚才描述的复杂性,并且因为我知道通常要避免 EAV 表,EAV 仍然是最佳解决方案吗?这似乎是表示这些数据的唯一合理的方式。我看到的唯一的其他替代方案是将表 1 与另一个包含如下元数据的表结合使用:

Table 3

Movie             Attribute            Source          Journalist
----------------------------------------------------------------------------------
Green Lantern      Director             CHUD              Sarah
Green Lantern    Leading Male           CHUD              James
Green Lantern   Leading Female      Dark Horizons         James
Green Lantern      Villain              CHUD              Sarah
The Tick           Director             Yahoo            Cameron
...

但这是非常危险的,因为如果有人更改表 1 中的列名,例如将“Villain”更改为“Primary Villain”,表 3 中的行仍然会简单地显示“Villain”,因此相关数据将不幸被解耦。如果“属性”列链接到另一个表,该表充当表 1 的列的枚举,这可能会有所帮助。当然,DBA 将负责维护此枚举表以匹配表 1 的实际列。实际上,可以通过使用 SQL Server 中包含表 1 中列名的系统视图,而不是手动创建枚举表来进一步改进这一点。虽然我不确定您是否可以拥有涉及以下的关系:系统视图。

你有什么建议? EAV 是唯一的出路吗?

如果只有一个元数据列(只是“来源”,没有“记者”)怎么办?是否还有必要走 EAV 路线?您可以有“Director”、“Director_Source”、“Leading Male”、“Leading Male_Source”等列,但这很快就会变得丑陋。还有我没有想到的更好的解决方案吗?

如果我没有澄清任何一点,请发表评论,我会根据需要添加更多内容。哦,是的,我使用的电影数据是捏造的:)

编辑:为了简明地重申我的主要问题,我希望表 1 具有简单性和真正的 RDBMS 设计,它真正很好地描述了电影条目,同时仍然以安全且可访问的方式存储属性上的元数据。这可能吗?或者EAV是唯一的方法吗?

编辑 2:在做了更多的网络研究之后,我还没有找到关于 EAV 的讨论,该讨论集中在将元数据存储在列上的愿望上。实现 EAV 的主要原因几乎总是动态且不可预测的列,但我的示例中并非如此。在我的例子中,总是有相同的四栏:导演、男主角、女主角、反派。但是,我想存储有关每行每列的某些事实(来源和记者)。 EAV 可以促进这一点,但我想避免这样做。

Update

使用表 2 的设计,除了将列“Movie”重命名为“Name”并将整个表命名为“Movie”之外,下面是 SQL Server 2008 中返回表 1 的透视操作:

SELECT Name, [Director], [Leading Male], [Leading Female], [Villain]
FROM (Select Name, Attribute, Value FROM Movie) as src
PIVOT
(
Max(Value)
FOR Attribute IN ([Director], [Leading Male], [Leading Female], [Villain])
)  AS PivotTable

您可以更改设计中您认为的事实值...您的数据模型中的事实似乎可以表示为以下 N 元组:

Movie | FactType | FactValue | FactSource | FactJournalist

以下表结构应该支持您想要的数据模型,并且可以相对轻松地进行索引和连接。您还可以创建一个仅转出事实值和事实类型的视图,以便您可以创建以下透视图:

MovieID | Movie Name | Director | LeadingMale | LeadingFemale | PrimaryVillain | etc

有趣的是,您可以认为这是将 EAV 模型完全应用于数据并将单个电影(具有导演、主角、反派等的直观属性)分解为一个枢轴结构(其中属性集中于源)的逻辑扩展的信息来代替。

所提出的数据模型的优点是:

  • 它是良好标准化的(尽管为了完整性,您可能应该将 FactType 字段标准化为参考表)
  • 可以创建一个视图,将事实类型有效地转变成表格结构
  • 它相对可扩展,允许数据库强制执行引用完整性和(如果需要)基数约束
  • 电影事实表可以进行子类化以支持不同类型的电影事实,而不仅仅是那些简单的文本字段
  • 对数据的简单查询相对有效

数据模型的一些缺点是:

  • 复合条件查询更难(但并非不可能)编写(例如,查找导演为 A、男主角为 B 的所有电影,等等...)
  • 该模型比更传统的方法或涉及 EAV 结构的方法稍微不那么明显
  • 插入和更新有点棘手,因为更新多个事实需要更新多行,而不是多列

我将电影数据提升了一个级别以规范化结构,并且您可以将电影名称下推到 MovieFact 结构中以保持一致性(因为对于某些电影,我可以想象即使名称是您可能想要跟踪源信息的内容) 。

Table Movie
========================
MovieID   NUMBER, PrimaryKey
MovieName VARCHAR

Table MovieFact
========================
MovieID          NUMBER,  PrimaryKeyCol1
FactType         VARCHAR, PrimaryKeyCol2
FactValue        VARCHAR
FactSource       VARCHAR
FactJournalist   VARCHAR

您的虚构电影数据将如下所示:

Movie Table
====================================================================================
MovieID  MovieName
====================================================================================
1        Green Lantern
2        The Tick

MovieFact Table
====================================================================================
MovieID  FactType       FactValue         FactSource       FactJournalist
====================================================================================
1        Director       Kubrick           CHUD             Sarah
1        Leading Male   Robert Redford    CHUD             James
1        Leading Female Miley Cyrus       Dark Horizons    James
1        Villain        Hugh Grant        CHUD             Sarah
2        Director       Mel Gibson        Yahoo            Cameron
2        Leading Male   John Lambert      Yahoo            Erica
...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在列上存储元数据 的相关文章

  • 如何使用 nosql 构建成就和徽章

    我目前有一个使用 mongodb 作为数据库的社交游戏应用程序 我的问题是 如果我想创建一个积分和徽章系统 有哪些建议 成就 徽章的业务逻辑可能会变得非常复杂并且非常临时 因此实时授予徽章似乎效率不高 我想象将跟踪的操作添加到队列中的某处
  • PostgreSQL 索引使用分析

    是否有工具或方法可以分析 Postgres 并确定应创建哪些缺失的索引 以及应删除哪些未使用的索引 我在使用 SQLServer 的 分析器 工具执行此操作方面有一些经验 但我不知道 Postgres 中是否包含类似的工具 我喜欢这样来查找
  • 在 django 中创建“历史”类型模型的最佳方法是什么?

    我想为我的 Django 应用程序创建一个类似于 Django 管理员的 最近操作 的功能 以便存储其他模型的历史信息 例如 假设我有两个模型 分别称为 Book 和 Author 我想要第三个模型来存储信息 例如由谁以及何时对模型中的给定
  • 如何在Oracle数据库11g中创建新模式/新用户?

    我已经申请了一家公司的实习机会 作为一个问题 他们要求我为他们的公司创建一个具有一定要求的架构 并将DDL文件 我已经安装了 Oracle 数据库 11g Express 版本 但如何在 Oracle 数据库 11g 中创建新架构 我在网上
  • 子查询与连接

    我重构了从另一家公司继承的应用程序的一个缓慢部分 以使用内部联接而不是子查询 例如 WHERE id IN SELECT id FROM 重构后的查询运行速度提高了约 100 倍 50 秒到 0 3 我预计会有改进 但谁能解释为什么它如此剧
  • 有很多数据库视图可以吗?

    我很少 每月 每季度 使用 Microsoft SQL Server 2005 数据库视图生成数百份 Crystal Reports 报告 在我不读取这些视图的所有时间里 这些视图是否会浪费 CPU 周期和 RAM 因为我很少从视图中读取数
  • Magento 设置脚本中的 ALTER TABLE 不使用 SQL

    乔纳森 戴 https stackoverflow com users 336905 jonathan day says 更新不应采用以下形式 SQL命令 我没遇到过 任何 DDL 或 DML 语句不能 通过 Magento 的配置执行 结
  • MySQL JOIN 滥用?情况会变得有多糟糕?

    我读了很多关于关系数据库的文章 在每个 SELECT 上使用许多 JOIN 语句 但是 我一直想知道滥用这种方法从长远来看是否会出现任何性能问题 例如 假设我们有一个users桌子 我通常会添加 最常用 的数据 而不是进行任何额外的联接 例
  • 为什么要为字符变化类型指定长度

    参考 Postgres 文档字符类型 http www postgresql org docs current static datatype character html 我不清楚指定字符变化 varchar 类型的长度 假设 字符串的长
  • parent_id 是外键(自引用)并且为 null?

    浏览 Bill Karwin 的书 SQL Antipatterns 第 3 章 Naive Trees 邻接表 父子关系 有一个注释表的示例 CREATE TABLE Comments comment id SERIAL PRIMARY
  • 列太多的表的缺点

    我有一些数据需要放入 PostgreSQL 数据库中 这些数据与学校有关 所以有很多与学校相关的属性 大部分是小整数 浮点数或小文本 所有数据每年都会发生变化 所以我正在创建一个名为的实体YearlyData并将属性放在那里 但问题是 属性
  • drupal 7 将实际内容存储在数据库中的哪里?

    我打开了 drupal 7 的数据库并在表中查找node node revisions and node types并且找不到 drupal 存储实际的位置body节点 内容 的 有人有线索吗 哦 我刚刚找到了 在 D7 中 他们实现了字段
  • 从多个表中选择 - 一对多关系

    我有这样的表 表产品 身份证 姓名 表格图像 产品 ID 网址 订单号 表价 产品 ID 组合 货币 价格 表数量 产品 ID 组合 数量 表 Product 与其他表是一对多关系 我需要查询表并得到类似这样的结果 伪数组 ProductI
  • 多租户 Rails 应用:不同技术的优缺点是什么?

    我最初是为一位客户编写 Ruby on Rails 应用程序的 现在 我正在更改它 以便它可以用于不同的客户 我的最终目标是某些用户 不是我 可以单击按钮并创建一个新项目 然后生成所有必要的更改 新架构 新表 代码处理 无需任何人需要我编辑
  • 如何在数据库中保存未来(!)日期

    这个问题专门涉及未来的日期和时间 对于过去的值 UTC 无疑是首选 我想知道是否有人对拯救生命的 最佳 方法有建议futureMySQL 数据库中的日期和时间 或者就此而言一般来说 特别是在该列可以保存不同时区时间的情况下 考虑到时区规则可
  • 如何处理长期运行系统中旧的、过时的数据库数据?

    程序员有哪些可能性来处理很少使用但不能简单删除的数据 因为至少报告仍然需要它 我想到的一些例子 大学老年时期停止的资助类型 未使用的货币 例如意大利里拉 消失国家的名称 例如奥匈帝国 苏联 一些部分解决方案是活动标志 活动周期 可视化优先级
  • 数据库设计 :: 2 个参与者事件中的标准化 :: 连接表或 2 列?

    Edit 更新广义问题以反映实际领域 曲棍球运动 实际的活动是比赛日程 参与者是团队 球队是最终的 所有者 即 当球队被删除时 任何相关的预定比赛 结果 球员和球员统计数据也应被删除 本线程到目前为止讨论的问题涵盖了将事件组合成具有 2 列
  • 数据库设计 - “推”模型,或写时扇出

    背景信息 我正在尝试检索我关注的人的图像 按最新时间排序 它就像 Twitter 新闻源 显示您朋友的最新动态 Plans 目前我只需要考虑一项 那就是图像 将来我计划分析用户的行为并将他们可能喜欢的其他图像添加到他们的提要中等 http
  • 在关系数据库中存储 1:1 用户关系的最佳方式

    存储用户关系的最佳方式是什么 例如友谊 在关系中必须是双向的 你是我的朋友 因此我是你的朋友 数据库 例如MYSql 我可以想到两种方法 每当一个用户与另一个用户成为好友时 我都会向数据库添加两行 其中 A 行由发起用户的用户 ID 和下一
  • 实体框架中 1:1 关系中关联的主体端意味着什么

    public class Foo public string FooId get set public Boo Boo get set public class Boo public string BooId get set public

随机推荐

  • 如何检测 Angular2 中的变量变化

    我有以下配置对象 它是在构造函数运行之前设置的 config Object onSlideChangeEnd function slide any this currentSlideIndex slide activeIndex 我想通知服
  • 如何使用 C# 获取 IIS 中网站的“浏览”URL?

    假设我在 IIS 中有 站点名称 网站 我可以通过以下方式访问它的大部分功能服务器管理器我的 C 代码中的类 我似乎不知道如何获取它的 浏览 URL 就像我在下面的屏幕截图中所示的那样 如果我进入 管理网站 gt 浏览 IIS管理器 它将使
  • 在 ASP.NET MVC 中将数据传递到母版页

    在不违反 MVC 规则的情况下将数据传递到母版页 使用 ASP NET MVC 的方法是什么 就我个人而言 我更喜欢编写传递给所有视图的抽象控制器 基本控制器 或基类 如果您希望视图具有强类型视图数据类 这可能适合您 其他解决方案可能更多c
  • Google AdMob“我们将尝试不再展示该广告”[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 目前不接受答案 我正在使用 AdMob 在 Android 应用中展示广告 我已经整合了所有步骤 并且收到了广告 但突然它开始显示 我们会尽量不再展示该广告 为什么会出现这种情况 None
  • 范围运算符从最大到最小递减:10..1 [重复]

    这个问题在这里已经有答案了 Perl 有一个范围运算符 当在foreach循环 不创建临时数组 foreach 1 1 000 000 code 如果第一个整数小于第二个整数 则不运行迭代 foreach 1 000 000 1 code
  • 将 DataTable 分配给 ViewState 是持久数据的好方法吗?

    我从数据库获取一个 DataTable 并分配给 ViewState 如下所示 因为我不想每次都访问我的数据库 只想检查 DataTable 以进行后续查找 DataTable dt GetDataTable ViewState dtTab
  • 如何确定计算机是否运行 XP Service pack 3

    使用注册表或文件系统 限制的原因是我将其作为 MSI 条件语句来执行 Cheers 在注册表项下 HKLM SOFTWARE Microsoft Windows NT CurrentVersion 寻找密钥对 当前版本 Microsoft
  • 在 Emacs 中使用 Python 的 Unicode 转换问题

    我试图了解在命令行上运行与作为 Emacs elisp 函数的一部分运行时 Python 脚本行为的差异 该脚本如下所示 顺便说一句 我使用的是 Python 2 7 1 import json t Foo print json dumps
  • 您将如何在 SQL 数据库中创建和存储用户定义的自定义字段?

    我需要允许用户向记录添加新字段 例如如果有联系人记录 用户可能想要添加 SSN 数字字段和 生日 日期 日历字段 当然 他们会通过用户界面来完成此操作 这些字段应该可用于输入所有联系人记录 考虑到我的应用程序同时为许多用户运行 不是单一公司
  • Angular Universal 生成 404(和其他 HTTP 代码)标头

    我正在使用 Angular Universal 创建一个网站 它将进行服务器端渲染 以便搜索引擎可以对其进行索引 我已经编码了 404 后备路由 它正确显示了其组件 但它显示了 HTTP 200 标头代码 如何强制使用特定的标头代码 我用谷
  • iOS 应用程序在 iOS 14 及更低版本的 Testflight 上启动时崩溃,但在 iOS 15+ 上不会崩溃

    从几天前开始 我们的应用程序和 或 Testflight 遇到了一些奇怪的问题 当从 Xcode 运行时 我们的应用程序在模拟器和设备 iOS 12 iOS 14 和 iOS 15 上运行良好 但当我们运行时 它在启动时崩溃了 通过 Tes
  • 如何让 IntelliJ 对项目中的所有主文件使用 JVM 选项?

    我可以配置一个主文件以使用所需的本机 但在我的项目中有多个主要函数 因此当我可以选择调试我想要的任何一个而无需为每个函数创建配置时 我需要所有文件来使用 JVM 选项一 您可以更改下面的配置Defaults node 模板在新版本中 所有新
  • 在 Xcode 10 中构建时重置应用程序后 String.hashValue 不唯一

    我有一个 通过以下方式获取字符串的哈希值 String hashValue 代码 我在下面添加了它 该代码在 Xcode 9 4 1 中运行良好 工作良好意味着每当我关闭应用程序并重新打开它时 结果hashValue相同 唯一 privat
  • C++ 函数中静态变量的生命周期是多长?

    如果一个变量被声明为static在函数的作用域中 它仅初始化一次并在函数调用之间保留其值 它的寿命究竟是多少 它的构造函数和析构函数什么时候被调用 void foo static string plonk When will I die T
  • 从 Delphi 调用 dotNET 并返回一个字符串

    Delphi 应用程序如何调用导出函数 非 COM dotNET 程序集并让该函数返回字符串 对于我的特定应用程序来说 COM 不是一个可能的解决方案 我可以控制通话的两端 到目前为止我所尝试过的 Delphi 客户端 type TStrP
  • 为什么我的 python 程序在 eclipse/pydev 中调试这么慢?

    我有一个相对简单 没有类 的 python 2 7 程序 该程序所做的第一件事是将 sqlite 数据库读入字典中 数据库很大 但不是很大 磁盘上大约 90Meg 读入大约需要 20 秒 读入数据库后 我初始化一些变量 例如 localMa
  • 制作 CSS 下拉菜单 2 列

    我目前有一个 CSS ul li 使用以下代码的下拉菜单 不幸的是 我希望子菜单显示为 2 列 因为该子菜单中有大约 16 个项目 有谁知道如何使用下面的代码使这个下拉菜单成为 2 列 menu border none border 0px
  • SVG 路径字符串上的布尔运算

    我遇到了一个概念上的困难问题 简而言之 我需要找到通过不同布尔运算组合的两个向量路径的向量路径 例如并 差 交 减 如果我能像 Canvas 的 globalCompositeOperation 那样进行操作 那就太好了 我到底该怎么做呢
  • 使用 pthread_cancel 取消线程:好习惯还是坏习惯

    我在 Linux CentOS 5 3 上有一个 C 程序 它生成多个线程 这些线程处于无限循环中以执行作业并睡眠一定分钟 现在 我必须取消正在运行的线程 以防出现新的配置通知 并重新启动一组新的线程 为此我使用了 pthread canc
  • 如何在列上存储元数据

    假设您正在收集有关即将上映的超级英雄电影的内部信息 并且您的主电影表如下所示 Table 1 Title Director Leading Male Leading Female Villain Green Lantern Kubrick