2012-04-06 73 views
2

我有一个看似简单的问题,但我无法完全弄清楚解决方案。我正在创建一个数据库设计来存储目标。目标是手动更新的,每次目标更新时我都需要一个条目。例如:随着时间的推移跟踪进度的数据库设计

减掉10磅:

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

然后一旦总磅数达到目标数量,那个目标就完成了。这是我设计的,到目前为止,但我看到它的一些问题:

目标表:

GoalId - INT - PK

用户ID = INT - FK

GoalTypeId = INT - FK

标题 - 字符串

进展表:

ProgressId - INT - PK

GoalId - INT - FK

IntervalX - 字符串?

IntervalY - string?

GoalAmount - String?

这是追踪此问题的最佳方式吗?有没有人看过我可以构建的基础架构来完成这个任务?

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

编辑:

对不起,我会详细说明一下。间隔X和Y将成为图表上的间隔值。所以如果X = 1和Y = 10,那么X轴将1,2,3 ...,Y将会变为10,20,30,...(这是我完全需要弄清楚的最好的东西方式来实现,但这是在现在backburner)

目标的类型是棘手的,因为有很多我想要做的。他们将需要很多不同的数据类型:目标

例子:

阅读日报 - 布尔

减掉10磅 - 整数或浮点数

节省$ 5000 - 金钱或浮动

命中销售配额 - 浮动

学习一种新的语言 - 字符串?(不知道追踪这一个最好的办法)

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

+0

什么样的目标可以存在。提到的那个,是唯一可以发布的类型吗?另外,如何跟踪进度,因为有一个数字和文字 – 2012-04-06 02:21:02

回答

4

你是正确的轨道。我可以推荐的唯一其他事情是查看关键的价值指标,并在您的设计中使用这一原则。 KVI(或KPI,就像它们在管理中所指的那样)是不同来源的值,它们被转换成可以使用公共逻辑处理的一组公共值。这将有助于推进具有不同类型里程碑的目标的进展,并且对于复合目标而言,这是至关重要的一步。我将在此详述一下:

目标被定义为在某个时间段内达到某个里程碑或里程碑组合。里程碑是需要具有共同处理价值的价值,或者是关键价值主体。例如,减掉10磅,你可以有一个关键值类型的“减肥”,将1磅转换为1千磅。如果您希望将里程碑与对方进行比较,您可能希望调整权重。例如,我希望变得更健康,感觉更有活力(目标)。为了做到这一点,我必须减掉10磅,减少我的饮食中的糖,并且每天至少循环15英里(里程碑)。比较这些值时,1英里不等于1磅。更像是30英里。从我的饮食中切下糖并不容易,但我们称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磅,但不需要,所以我不会在那个价格上贴太高的价格。然而,我的朋友卢卡超重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) 
) 
+0

这太棒了!绝对是我在找的东西(尽管我当时不知道)。我遇到的主要问题是如何将诸如学习新语言之类的非数学事物转化为可测量的事物。我认为KVI只是我需要的技巧。我会更多地了解KVI背后的原理,并且可能会重写我的应用程序。但它确实可以更容易地将新目标扩展到组合中,而只是简单地确定KPI。 +1000,如果我有。干杯 – ledgeJumper 2012-04-10 13:49:36

1

难道不工作,有这样的事情:

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是否在您的设计中提供了服务 - 您能详细阐述一下吗?

1

如果所有的目标都与数字..即减少磅,运行里程等。然后,当然,你可以做到这一点..

喜欢的东西

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

GoalTable GoalId(PK) GoalExpectedProgress(INT) 用户ID(FK)

ProgressTable GoadId(FK) Progress_Int

可以加入此Progress_Int为同一GoalId &然后确保它符合GoalExpectedProgress ..

但对于像整理成书的目标,购买杂货等。你必须提出一个更好的计划。

+2

对于完成/非完成类型的任务,您可以使用1/0整数作为真/假替代。 – lyrisey 2012-04-06 18:01:00

+1

是的..你说得对。通过一个更好的计划,我的意思是,如果他有两种类型的任务(数量相关和完成/未完成),他将​​不得不按照上面所说的来做。 +1添加到我的解释。 – Krishna 2012-04-06 18:26:02

1

感谢您的答案!我采取了一些你说的话,然后重新设计了我正在尝试做的事情。这里是我想出了一个解决方案:

目标表

GoalId - PK

GoalTypeId - FK

用户ID - FK

GOALNAME

GoalStart

GoalComplete

CompletionTarget

GoalType表

GoalTypeId - PK

类型名

TypeDescription

ProgressDataType

IncrementDataType

Progress表

ProgressId - PK

ProgressIncrement

TimeIncrement

OccuranceDate

用户表

用户ID - PK

用户名

如何实现逻辑

大多数我试图做到的是离我有多近达成一个目标,或者完成的百分比。有了这个设置,我已经在存储过程中添加了一个If ElseIf语句,该语句将操纵Progress表中的原始数据以提供所需的结果。 If语句将基于GoalType表来确定需要执行哪种逻辑。

感谢大家的意见!

相关问题