web-dev-qa-db-ja.com

サロゲートキーの解決、またはサロゲートvナチュラル引数に何が欠けていますか?

私は代理対自然キーの議論で両方の陣営から多くを読みました。私が理解するのに苦労していること、そして特に代理キーがどのように効率的であるかを説明する際に見過ごされているように見えることは、参照テーブルが代理キーをどのように解決するのですか?

たとえば、アプリケーションで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テーブルでどのように使用しますか?自然キーを使用する場合、主キーはuserIdtaskNumberの複合主キーである可能性があり、プログラムですべての部分を収集したと仮定して、両方に同時に挿入できます。 。

2
user84836

例の適切な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 CTERETURNING句で使用するか、トランザクションで2つのINSERTステートメントを lastval() で使用します(これは、SQLサーバーの SCOPE_IDENTITY()に相当するPostgres @Aaronのコメントで言及されています):

いずれかの方法のコード例に関連する回答。

3