私は代理対自然キーの議論で両方の陣営から多くを読みました。私が理解するのに苦労していること、そして特に代理キーがどのように効率的であるかを説明する際に見過ごされているように見えることは、参照テーブルが代理キーをどのように解決するのですか?
たとえば、アプリケーションでORMを使用していて、アプリケーションオブジェクトにuserID
があります。ここで、次のように定義されているSelectedTask
テーブルとSubTask
テーブルに挿入します(実際のWordの例の厄介さは無視してください)。
CREATE TABLE SelectedTask(
userID INT References User(userID)
taskNumber INT,
name TEXT ,
jobSiteID INT References Site(jobSiteID),
PRIMARY KEY (???)
);
CREATE TABLE SubTask(
assignee INT References User(assignee),
subTaskID INT References Subtasks(subTaskID),
timeAllowed INT,
reportTo INT References Group(reportTo),
-- how do we reference SelectedTask?
);
SelectedTask
テーブルに代理キーを使用する場合、それをSubTask
テーブルでどのように使用しますか?自然キーを使用する場合、主キーはuserId
とtaskNumber
の複合主キーである可能性があり、プログラムですべての部分を収集したと仮定して、両方に同時に挿入できます。 。
例の適切なPostgresスキーマは次のようになります。
_CREATE TABLE selected_task(
selected_task_id serial PRIMARY KEY -- surrogate PK
, user_id int REFERENCES users(user_id)
, task_number int
, name text
, jobsite_id int REFERENCES site(jobsite_id)
);
CREATE TABLE sub_task(
sub_task_id serial PRIMARY KEY
, selected_task_id int REFERENCES selected_task -- this is how
, assignee int REFERENCES users(assignee)
, time_allowed int
, report_to int REFERENCES groups(report_to)
);
_
INSERT
?data-modifying CTE をRETURNING
句で使用するか、トランザクションで2つのINSERT
ステートメントを lastval()
で使用します(これは、SQLサーバーの SCOPE_IDENTITY()
に相当するPostgres @Aaronのコメントで言及されています):
いずれかの方法のコード例に関連する回答。