5

私は一見単純な問題を抱えていますが、解決策を完全に理解することはできません。目標を保存するためのデータベース設計を作成しています。目標は手動で更新されます。目標が更新されるたびにエントリが必要です。例えば:

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-文字列?

これはこれを追跡するための最良の方法ですか?これを達成するために構築できる基本スキーマを見た人はいますか?

私が持っていたもう1つの考えは、すべての生データにこの設計を使用し、ストアドプロシージャとビューを使用して、データを希望どおりに表示することでしたか?

編集:

申し訳ありませんが、少し詳しく説明します。間隔XとYは、グラフ上の間隔値になります。したがって、X=1およびY=10の場合、x軸は1,2,3、...になり、Yは10,20,30、...になります(これは完全に別のものであり、私は最良のものを理解する必要があります実装する方法ですが、それは今のところバックバーナーにあります)

やりたいことがたくさんあるので、目標の種類は難しいです。それらは、さまざまなデータ型の集まりである必要があります。

目標の例:

毎日読む-ブール値

10ポンドを失う-intまたはfloat

5000ドル節約-お金またはフロート

販売クォータに達する-フロート

新しい言語を学ぶ-文字列?(これを追跡するための最良の方法はわかりません)

など..これが少し明確にするのに役立つことを願っています

4

4 に答える 4

8

あなたは確かに正しい方向に進んでいます。私がお勧めできる他の唯一のことは、キーバリューインジケーターを調べ、この原則を設計に使用することです。KVI(または管理で参照されるKPI)は、異なるソースの値であり、共通のロジックを使用して処理できる共通の値のセットに変換されます。これは、さまざまなタイプのマイルストーンを持つ目標の進捗状況を評価するのに役立ちます。複合目標の場合、これは重要なステップです。これについて少し詳しく説明します。

目標は、特定の期間内に特定のマイルストーンまたはマイルストーンの組み合わせに到達することとして定義されます。マイルストーンは、共通の処理値、つまりキー値インジケーターを持つために必要な値です。たとえば、10ポンドを失う場合、1ポンドを1 KVIに変換する、「減量」のキー値タイプを持つことができます。マイルストーンを相互に比較したい場合は、重みを調整することをお勧めします。たとえば、私はより健康になり、より元気になりたい(目標)。これを行うには、10ポ​​ンドを失い、食事から砂糖を減らし、1日あたり少なくとも15マイル(マイルストーン)を循環させる必要があります。これらの値を比較すると、1マイルは1ポンドに相当しません。30マイルのように。私の食事から砂糖を切るのは簡単ではありませんが、KVIを「砂糖のない日」と呼び、砂糖のない毎日に0.5ポンドに相当する値を与えましょう。

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

1日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)
)
于 2012-04-07T07:29:07.023 に答える
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が設計でどの機能を果たしているのかよくわかりませんが、それについてさらに詳しく説明していただけますか?

于 2012-04-06T02:25:35.277 に答える
1

すべての目標が数字に関連している場合..つまり、ポンドを減らす、マイルを走るなど..確かに、あなたはそれを行うことができます..

何かのようなもの

UserTable Userid(PK)UserName

GoalTable GoalId(PK)GoalExpectedProgress(Int)UserId(FK)

ProgressTable GoadId(FK)Progress_Int

このProgress_Intは、同じGoalIdに追加して、GoalExpectedProgressを満たしていることを確認できます。

しかし、本を完成させたり、食料品を購入したりするなどの目標については、より良い計画を立てる必要があります。

于 2012-04-06T02:29:38.720 に答える
1

答えてくれてありがとう!私はあなたが言ったことのいくつかを取り、それから私がやろうとしていたことを再設計しました。これが私が思いついた解決策です:

ゴールテーブル

GoalId-PK

GoalTypeId-FK

UserId-FK

GoalName

GoalStart

GoalComplete

CompletionTarget

GoalTypeテーブル

GoalTypeId-PK

TypeName

TypeDescription

ProgressDataType

IncrementDataType

進捗表

ProgressId-PK

ProgressIncrement

TimeIncrement

OccuranceDate

ユーザーテーブル

UserId-PK

ユーザー名

ロジックの実装方法

私が達成しようとしていたことのほとんどは、目標にどれだけ近づいているか、または完了率です。この設定により、Progressテーブルの生データを操作して必要な結果を得るIfElseIfステートメントを使用してストアドプロシージャを作成しました。IfステートメントはGoalTypeテーブルに基づいて、実行する必要のあるロジックの種類を決定します。

皆様のご意見ありがとうございました!

于 2012-04-06T18:54:00.570 に答える