【问题标题】:Database design for tracking progress over time用于跟踪随时间推移的进度的数据库设计
【发布时间】:2012-04-06 02:15:18
【问题描述】:

我有一个看似简单的问题,但我无法找到解决方案。我正在创建一个数据库设计来存储目标。目标是手动更新的,每次更新目标时我都需要一个条目。例如:

减掉 10 磅:

第 1 天:减掉 1 磅。 第 3 天:减掉 2 磅。 第 7 天:减了 7 磅。

然后,一旦总磅数达到目标金额,该目标就完成了。到目前为止,这是我的设计,但我发现它存在一些问题:

目标表:

GoalId - int - PK

UserId = int - FK

GoalTypeId = int - FK

标题 - 字符串

进度表:

ProgressId - int - PK

GoalId - int - FK

IntervalX - 字符串?

IntervalY - 字符串?

GoalAmount - 字符串?

这是跟踪此问题的最佳方法吗?有没有人看到我可以建立的基本模式来完成这个?

我的另一个想法可能是对我所有的原始数据使用这种设计,并依靠存储过程和视图以我想要的方式呈现数据?

编辑:

对不起,我会详细说明一下。区间 X 和 Y 将是图表上的区间值。因此,如果 X = 1 且 Y = 10,则 x 轴将变为 1,2,3,... 而 Y 将变为 10,20,30,...(这完全是另外一回事,我需要找出最好的方式来实现,但现在是次要的)

目标的类型很棘手,因为我想做的事情很多。它们需要是一堆不同的数据类型:

目标示例:

每日阅读 - 布尔值

减掉 10 磅 - 整数或浮点数

节省 5000 美元 - 金钱或浮动

达到销售配额 - 浮动

学习一门新语言 - 字符串? (不确定跟踪这个的最佳方法)

等等..希望这有助于澄清一点

【问题讨论】:

  • 可以提出什么样的目标。是上面提到的,唯一可以发布的类型吗?另外,您将如何跟踪进度,因为有一个数字和文本

标签: sql-server database


【解决方案1】:

您肯定走在正确的轨道上。我唯一可以推荐的另一件事是研究关键价值指标,并在您的设计中使用这一原则。 KVI(或 KPI,因为它们在管理中被称为)是不同来源的值,它们被转换为可以使用通用逻辑处理的一组通用值。这将有助于评估具有不同类型里程碑的目标的进度,对于复合目标,这是至关重要的一步。我将对此进行详细说明:

目标被定义为在特定时期内达到特定里程碑或里程碑组合。里程碑是需要具有共同处理值或键值指标的值。例如,减掉 10 磅,您可以有一个键值类型为“Weight Loss”,将 1 磅转换为 1 KVI。如果您希望将里程碑相互比较,您可能希望调整权重。例如,我希望变得更健康,感觉更有活力(目标)。为了做到这一点,我必须减掉 10 磅,减少饮食中的糖分,每天至少骑行 15 英里(里程碑)。比较这些值时,1 英里不等于 1 磅。更像是30英里。从我的饮食中减少糖分并不容易,但让我们将 KVI 称为“无糖日”,并为无糖的每一天赋予相当于半磅的价值。那么 KVI 是:

1 pound = 2 KVI
1 day without sugar = 1 KVI
1 mile = 1/30 KVI

如果我每天多骑 15 英里,我可能会原谅自己一点点糖,所以这应该被纳入里程碑。换句话说,我可以达到我的自行车里程碑的 200% 和我的糖里程碑的 75%,并且仍然达到我的总体目标。但是,我不能超越这一点,仍然希望感觉健康。因此,我实现这一目标的里程碑类似于:

Lose 10 pounds: KVIType="Weight Loss", Target=20KVI, cap=100%
No sugar for period (let's say 2 weeks):KVIType="Days without sugar", target=14KVI, cap=100%
Cycle 15 miles per day: KVIType="Cycling", target=7KVI, cap=200%

学习一门新语言就是一个很好的例子。这需要学习语言的语法细微差别,有时需要学习不同的字母表、全新的词汇,然后将这些全部结合到日常使用中。所以这里有一个例子:

Learn language grammar = 100 KVI, which you can work as a percentage of a grammar course completed, for example
1000 words vocabulary = 100 KVI
Conversation = 20 KVI

在此示例中,您会将每个里程碑的上限设为 100%。您可能已经熟记语法并且掌握了 10,000 个单词,但是在您花一些时间讲该语言之前,您还没有学会它。

通过调整转换表中的权重,您可以开始以一种对您有意义的方式相互比较目标。我有能力减掉 10 磅,但没必要,所以我不会给那个标价太高。然而,我的朋友 Luka 超重 100 磅,出于健康原因不得不超重,所以他的 KVI 值会更高。您还可以扩展如何组合里程碑以提供目标的进度指示(即使用所有 KVI 的总和、任何组件里程碑的平均或最小完成百分比)。

这就是我的想法:

CREATE TABLE KVIType (
    KVITypeId INT IDENTITY(1, 1) PRIMARY KEY CLUSTERED,
    KVIName VARCHAR(50),
    Description VARCHAR(200),
    Multiplier DOUBLE PRECISION
)

CREATE TABLE Goal (
    GoalId INT IDENTITY(1, 1) PRIMARY KEY CLUSTERED,
    UserId INT FOREIGN KEY REFERENCES User(UserId),
    GoalName VARCHAR(50),
    GoalStart DATETIME,
    GoalComplete DATETIME,
    TargetKVI DOUBLE PRECISION,
    CurrentKVI DOUBLE PRECISION
)

CREATE TABLE Milestone (
    MilestoneId INT IDENTITY(1,1) PRIMARY KEY CLUSTERED,
    GoalId INT FOREIGN KEY REFERENCES Goal(GoalId),
    KVITypeId INT FOREIGN KEY REFERENCES KVIType(KVITypeId),
    MilestoneName VARCHAR(50),
    Description VARCHAR(200),
    TargetKVI DOUBLE PRECISION,
    CurrentKVI DOUBLE PRECISION,
    TargetDate DATETIME,
    CompletedDate DATETIME,
    Cap INT)

CREATE TABLE Progress (
    ProgressId INT IDENTITY(1, 1) PRIMARY KEY CLUSTERED,
    MilestoneID INT FOREIGN KEY REFERENCES Milestone(MilestoneId),
    InputValue DOUBLE PRECISIoN,
    KVIValue DOUBLE PRECISION,
    OccuranceDate DATETIME
)

CREATE TABLE User (
    UserId INT IDENTITY(1, 1) PRIMARY KEY CLUSTERED,
    UserName VARCHAR(100)
)

【讨论】:

  • 这太棒了!绝对是我正在寻找的东西(即使我当时不知道)。我遇到的主要问题是如何将学习一门新语言之类的非数学事物转换为可测量的事物。我认为 KVI 正是我需要的技巧。我将阅读更多关于 KVI 背后原理的内容,并可能围绕它重写我的应用程序。但这肯定更容易将新目标扩展到组合中,而只需确定 KPI。 +1000 如果我有他们。干杯
【解决方案2】:

有这样的东西是不是不行:

Goals(Goal_ID, User_ID, Goal_Type_ID, Title, Goal_Amount)
Progress(Goal_ID, Date_Time, Progress)

PK_Goals(Goal_ID)
PK_Progress(Goal_ID, Date_Time)

FK_Progress_Goals(Goal_ID)

进度可以是“自上次以来”或总金额 - 没关系。 我不太确定区间 X 和区间 Y 在您的设计中提供哪些功能 - 您能否进一步详细说明?

【讨论】:

    【解决方案3】:

    如果所有目标都与数字相关......即减少体重、跑步里程等......那么当然,你可以做到......

    类似

    用户表 用户名(PK) 用户名

    目标表 目标ID(PK) 目标预期进度(整数) 用户 ID(FK)

    进度表 GoadId(FK) Progress_Int

    可以为相同的 GoalId 添加此 Progress_Int,然后确保它满足 GoalExpectedProgress..

    但是对于完成一本书、购买杂货等目标,你必须想出一个更好的计划。

    【讨论】:

    • 对于 Done/NotDone 类型的任务,您可以只使用 1/0 整数作为真/假替代。
    • 是的..你是对的。通过一个更好的计划,我的意思是,如果他有两种类型的任务(与数字相关的和完成/未完成的),他将不得不做你上面所说的事情。 +1 添加到我的解释中。
    【解决方案4】:

    感谢您的回答!我接受了你所说的一些内容,然后重新设计了我想要做的事情。这是我想出的解决方案:

    目标表

    GoalId - PK

    GoalTypeId - FK

    用户 ID - FK

    目标名称

    目标开始

    目标完成

    完成目标

    目标类型表

    GoalTypeId - PK

    类型名称

    类型描述

    进度数据类型

    增量数据类型

    进度表

    ProgressId - PK

    进度增量

    时间增量

    发生日期

    用户表

    用户 ID - PK

    用户名

    我如何实现逻辑

    我试图完成的大部分工作是我离实现目标的距离,或完成的百分比。通过此设置,我在存储过程中使用了 If ElseIf 语句,该语句将操纵 Progress 表中的原始数据以提供所需的结果。 If 语句将根据 GoalType 表来确定需要执行的逻辑类型。

    感谢大家的意见!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-01
      相关资源
      最近更新 更多