当前位置: 首页 > 面试题库 >

为实现理智或性能而进行非规范化处理?

益富
2023-03-14
问题内容

我开始了一个新项目,他们有一个非常规范的数据库。可以作为查找内容的所有内容都存储为查找表的外键。这是标准化的并且很好,但是我最终对最简单的查询进行了5个表联接。

    from va in VehicleActions
    join vat in VehicleActionTypes on va.VehicleActionTypeId equals vat.VehicleActionTypeId
    join ai in ActivityInvolvements on va.VehicleActionId equals ai.VehicleActionId
    join a in Agencies on va.AgencyId equals a.AgencyId
    join vd in VehicleDescriptions on ai.VehicleDescriptionId equals vd.VehicleDescriptionId
    join s in States on vd.LicensePlateStateId equals s.StateId
    where va.CreatedDate > DateTime.Now.AddHours(-DateTime.Now.Hour)
    select new {va.VehicleActionId,a.AgencyCode,vat.Description,vat.Code,
vd.LicensePlateNumber,LPNState = s.Code,va.LatestDateTime,va.CreatedDate}

我建议我们对某些内容进行标准化处理。像州代码一样
我没有看到状态码在我的一生中发生变化。3个字母的代理机构代码也有类似的故事。这些是由代理机构分发的,永远不会改变。

当我向DBA提出状态代码问题时,这5个表已联接。我得到“我们被规范化”和“联接很快”的响应。

是否有令人信服的论点去规范化?如果没有其他原因,我会为了理智而这样做。

T-SQL中的相同查询:

    SELECT VehicleAction.VehicleActionID
      , Agency.AgencyCode AS ActionAgency
      , VehicleActionType.Description
      , VehicleDescription.LicensePlateNumber
      , State.Code AS LPNState
      , VehicleAction.LatestDateTime AS ActionLatestDateTime
      , VehicleAction.CreatedDate
FROM VehicleAction INNER JOIN
     VehicleActionType ON VehicleAction.VehicleActionTypeId = VehicleActionType.VehicleActionTypeId INNER JOIN
     ActivityInvolvement ON VehicleAction.VehicleActionId = ActivityInvolvement.VehicleActionId INNER JOIN
     Agency ON VehicleAction.AgencyId = Agency.AgencyId INNER JOIN
     VehicleDescription ON ActivityInvolvement.VehicleDescriptionId = VehicleDescription.VehicleDescriptionId INNER JOIN
     State ON VehicleDescription.LicensePlateStateId = State.StateId
Where VehicleAction.CreatedDate >= floor(cast(getdate() as float))

问题答案:

我不知道我什至不称呼您要进行非规范化-
看起来您只想用自然外键(状态缩写,代理代码)替换人工外键(StateId,AgencyId)。使用varchar字段而不是整数字段会降低连接/查询的性能,但是(a)如果您大部分时间甚至不需要连接表,因为无论如何您都希望使用自然FK,那么这没什么大不了的,并且(
b)您的数据库需要相当大/要承受高负载。

但是djna是正确的,因为在进行此类更改之前,您需要全面了解当前和将来的需求。您确定三个字母机构的代码即使在五年后也不会改变吗?真的,真的可以吗?



 类似资料:
  • 我了解批次归一化有助于更快的训练,将激活转向单位高斯分布,从而解决梯度消失问题。批次规范行为在训练(使用每个批次的平均值/var)和测试时间(使用训练阶段的最终运行平均值/var)中的应用不同。 另一方面,实例归一化作为对比度归一化,如本文所述https://arxiv.org/abs/1607.08022。作者提到,输出样式化的图像不应依赖于输入内容图像的对比度,因此实例规范化有助于实现。 但是

  • 非规范化数据不存储规范化的数据。换句话说非规范化意味着相同数据的多个拷贝同时存在。 上一章中,我们在帖子中非规范化评论总数,以避免每次都加载所有的评论。在数据建模意义上说这是冗余的,因为我们可以通过计数每个评论,随时计算出该总数(当不考虑运行速度)。 非规范化通常意味着额外的开发工作。在例子中,我们每次添加或删除评论时,还需要同时更新相关的帖子,以确保 commentsCount 字段保持准确。这

  • 我已经成功训练了一个超过100000个样本的模型,该模型在训练集和测试集都表现良好。然后,我尝试对一个特定样本(100000个样本中的一个)进行微调,并使用经过训练的权重作为初始化。 但结果有点奇怪,我相信这是由批处理规范化层引起的。具体而言,我的代码可以列出如下: model.load_weights速率=model.evaluate(x, y)打印速率 mymodel是一个自定义函数来生成我的

  • 我可以在输入层之后使用批处理规范化层而不规范化我的数据吗?我可以期望得到类似的效果/性能吗? 在keras函数中,它应该是这样的:

  • 调用存储引擎的第1个方法是调用新的处理程序实例。 在存储引擎源文件中定义handlerton之前,必须定义用于函数实例化的函数题头。下面给出了1个来自CSV引擎的示例: static handler* tina_create_handler(TABLE *table); 正如你所见到的那样,函数接受指向处理程序准备管理的表的指针,并返回处理程序对象。 定义了函数题头后,用第21个handlerto

  • 我有一个非规范化用例——一个hiveavro事实表与14个较小的维度表连接,生成一个非规格化拼花输出表。输入事实表和输出表都以相同的方式进行分区(Category=TEST1,YearMonthId=202101)。我确实运行历史处理,这意味着一次处理并加载给定类别的几个月。 我使用的是Spark 2.4.0/pyspark数据帧,所有表连接的广播连接,动态分区插入,最后使用colasce来控制输