使用SQL,设计与其他表的接口类似的表的最佳实践是什么?

时间:2016-08-09 21:00:56

标签: mysql sql database postgresql database-design

我正在试图弄清楚过去一年中遇到过几次情况的最佳做法。

为了说明我设计了一个由用户观看的用户,电影和电影组成的假数据库。

enter image description here

在此示例中,我们希望能够捕获有关用户观看电影的任何时间的元数据,例如他们的位置或他们使用的设备,以及我们可能希望在将来收集的元数据类型可能会成长。目标是设计一个数据库,可以为一次电影观看体验聚合多种类型的元数据。

因此,我创建了一个名为MovieWatchedMetaData的表,它就像是包含元数据的不同表之间的桥梁。前提是该表将把主要数据表(如LocationWatched)中的主键链接到特定的电影观看场合。

我不确定这种方法,从长远来看它是否有害。这是一种糟糕的做法吗?有没有更好,更合适的方法来实现这一目标?你会如何组织这些表?

2 个答案:

答案 0 :(得分:1)

这对于评论来说太长了,所以我做了一个答案。我现在正在打电话,但如果我今晚有时间,我会回到这个并给你一个ERD来更好地理解它。

表或一组表的接口几乎应该只是一个视图。话虽如此,我看到了一些选择:

  1. 创建一个包含电影场合ID的主元数据表,然后为要链接到它的每种元数据创建一个id。您可以像现在一样将这些其他类型的元数据保存在自己的表中。如果要跟踪其他数据,则需要将列添加到主元数据跟踪器表中。

  2. 查看元数据只是链接到电影场合的键/值对,只是有一个视图来转动该表,以便键成为列,值成为这些列中的行。只要您不想在添加不同类型的元数据进行跟踪时更新视图以容纳额外的列,就可以使用任意元数据为电影体验提供动态界面。如果您不介意在过程而不是视图中检索结果,您实际上可以使用动态sql根据所选电影事件的键/值对确定应该存在哪些元数据列,并构建/执行您可以动态地进行数据透视查询,而不必在需要添加列时重新编译视图。

  3. 为什么需要将每个元数据作为自己的列?如果您可以为元数据派生通用结构(可能是名称,描述,可空时间戳,值和电影体验ID),那么您最终会得到一堆链接到每个电影体验的元数据行,就像您一样想象一篇博文可能有多个标签链接到它,除非在我们的例子中标签实际上是一个具有多个字段的对象。

答案 1 :(得分:1)

enter image description here

你需要考虑的是" grunt"为观看数据添加新方面的因素和" grunt"获取数据的因素。没有一个解决方案(我知道)会修复它,所以你永远不必修改你的查询。 (但是,考虑在PostgreSQL中探索OO SQL表达式。)

  1. 可以在VIEWING中添加一个字段(这是您的MoviesWatched表)。例如,查看开始时间可能很适合查看表。这将是不太可能改变结构的事情。
  2. 可以将其添加为具有外键的表格以供查看。例如,ViewingLocation表具有一组坐标。这与Viewing有1:1的关系,可以说可以进入Viewing表。但是,今天您可以将它们记录为GPS坐标。明天你可能想要添加标高或链接到一个国家。
  3. 它可以添加为标准项目列表的链接,就像我为Device做的那样。设备可能只列出一个简单的通用设备以及您要跟踪该设备的所有信息。然后,多对多连接将其作为DeviceUsage(或DeviceUsed)连接到查看,以供查看。这将是您想要反复引用的标准事物。
  4. 请注意,Viewer和Movie实际上也是观看的元数据。它们只是一个特例,因为每个都只有一个。 (如果你想在每次观看时记录多个观众怎么办。在我的图表中,观看是一个人观看一部电影的事件。同时观看同一部电影的两个人将是两个观看。)< / p>

    因此,我可能会创建一个数据库视图,将视图中的所有内容挂起,以便检索和聚合任何元数据。我会根据它在上述3个标准之一中的拟合程度,为每个观看添加未来的元数据。我会在添加新的元数据时修改我的数据库视图。

    正如我的导师曾经说过的那样,&#34;那是一种方式。&#34;我怀疑这种方式有问题取决于环境。我完全希望被火热。 :-)很想看到其他解决方案 - 特别是熟悉OO-SQL的人。