-1

私は一般的にかなりの初心者ですが、理論、アイデアなどがあります...

日付を使用して、一意の TaskID 列 [主キーかどうか] を持つタスク データベースを作成したいと考えています。エントリを自動生成する必要があります。衝突を避けるために、最後に番号を付けたいので、これですべてのエントリを一意にするという目標が達成されるはずです。したがって、一連のエントリは次のようになります。

201309281 [2013-09-28]

201309282

201309291

私の考えでは、EST の真夜中にリセットされる自動インクリメントを使用して、指定された日付に再び開始するか、またはそのようなものを使用できると考えています。

このように機能させることの利点は、特定の日に作成されたすべてのタスクを表示できることですが、特定のタスクは、たとえば 1 週間後まで完了または請求さ​​れない可能性があります。このようにして、作成日、完了日、または請求日で検索できます。

タスク データベースの最終目標を達成するには多くの方法があることを認識しています。これが可能かどうか、またはそれを主キー列として実装する方法、またはその問題に関する他の列について誰かが考えているかどうか、私はただ興味がありました。

また、この質問が不明確である場合はお詫び申し上げます。ここでまとめてみます。行が作成された日付に基づいて自動インクリメント列を作成すると、次の形式で末尾に余分な数字がある数値 [20130929] として日付が自動的に生成され、さらに末尾にその余分な桁数がありますか? EST または UTC の午前 0 時に毎日「1」にリセットしますか? そして、達成する方法についての考えは?

例: 201309291

編集:ところで、MVC4 Web アプリを使用して、ユーザーに CRUD 機能を提供したいと思います。C# を使用します。この事実が選択肢を広げるのではないかと思いました。

編集: スタックでこの q/a を見つけましたが、似ているように見えますが、私の質問には完全には答えていません。私の考えでは、ここにリンクを投稿すると答えが見つかるかもしれません。自動インクリメント列を毎日 0 にリセットする

4

3 に答える 3

2

私は、あなたが db 設計 Nick に不慣れだと思いますが、この種の設計は、ベテランの DBA をうんざりさせるでしょう。主キーに情報を入れないようにする必要があります。達成しようとしている結果は、以下のコードのようなものを使用して達成できます。PK は常にダム ID であるべきであり、インテリジェントなキーではないことを忘れないでください!


免責事項: 私は代理キーの設計を強く支持しており、その方向に偏っています。私は、自然キー設計のトレードオフやダウンストリームへの影響をアーキテクチャが十分に考慮していないことに何度も悩まされてきました。私はナチュラル キーの支持者の意見を謙虚に尊重し、理解していますが、リレーショナル ビジネス アプリを開発した私の経験では、代理デザインは 99% の確率でより良い選択です。


(ところで、実際には RANK 句に createdt フィールドさえ必要ありません。代わりに、PARTITION の ORDER BY 句で自動インクリメント PK を使用できます)。

CREATE TABLE tbl(
    id int IDENTITY(1,1) NOT NULL,
    dt date NOT NULL,
    createdt datetime NOT NULL

    CONSTRAINT PK_tbl PRIMARY KEY CLUSTERED (id ASC)
)
go

'I usually have this done for me by the database 
'rather than pass it from middle tier
'ALTER TABLE tbl ADD  CONSTRAINT DF_tbl_createdt  
'   DEFAULT (getdate()) FOR createdt


insert into tbl(dt,createdt) values
    ('1/1/13','1/1/13 1:00am'),('1/1/13','1/1/13 2:00am'),('1/1/13','1/1/13 3:00am'),
    ('1/2/13','1/2/13 1:00am'),('1/2/13','1/1/13 2:00am'),('1/2/13','1/1/13 3:00am')
go

SELECT id,dt,rank=RANK() OVER (PARTITION BY dt ORDER BY createdt ASC)
from tbl
于 2013-09-29T21:30:37.270 に答える
0

これは非常に悪い設計思想だと言えます。主キーは、理想的には代理である必要があり、SQL Server によって自動的に作成されます。

あなたが作成したロジックはうまく実装されるかもしれませんが、手作業が多いため、多くの複雑さ、メンテナンスのオーバーヘッド、およびパフォーマンスの問題が発生する可能性があります。

PK を作成するには、IDENTITY プロパティ、SEQUENCES (SQL Server 2012 の新機能)、または GUID (newID()) のいずれかに制限する必要があります。

デザインに合わせたい場合でも、Date タイプの列と IDENTITY int/bigint 列を組み合わせることができます。また、追加の計算列を追加してそれらを連結できます。真夜中ごとに IDENTITY 列をリセットするのは得策ではありません。

于 2013-09-30T07:15:07.893 に答える
0

わかりました、私は答えを見つけました。この方法には私が知らない問題があるかもしれないので、コメントを歓迎します。しかし、この方法はうまくいきます。

CREATE TABLE [dbo].[MainOne](
[DocketDate] NVARCHAR(8),
[DocketNumber] NVARCHAR(10),
[CorpCode] NVARCHAR(5),
CONSTRAINT pk_Docket PRIMARY KEY (DocketDate,DocketNumber)
)
GO
INSERT INTO [dbo].[MainOne] VALUES('20131003','1','CRH')
GO
CREATE TRIGGER AutoIncrement_Trigger ON [dbo].[MainOne]
 instead OF INSERT AS
 BEGIN
 DECLARE @number INT
 SELECT @number=COUNT(*) FROM [dbo].[MainOne] WHERE [DocketDate] = CONVERT(DATE, GETDATE()) 
 INSERT INTO [dbo].[MainOne] (DocketDate,DocketNumber,CorpCode) SELECT (CONVERT(DATE, GETDATE    
 ())),(@number+1),inserted.CorpCode FROM inserted
END

何かご意見は?回答としてマークするまで 3 日間待ちます。私が「sisdog」をマークしていない唯一の理由は、彼の答えが挿入クエリの実行時にこれを自動関数にするようには見えないからです。

于 2013-10-04T03:00:58.670 に答える