2

私はデータベースを設計している最中であり、テーブル(タスク)の1つは、それ自体と1対多の関係を持つことができる必要があります。これは、タスクが同じデータを持つ複数のサブタスクを持つことができるためです(SOでの質問と回答のように)。

同じテーブルで1対多を作成する方法について、SQLがあまり強力ではないため、少し混乱しています。

現在、次の行があります。

TaskId(一意の識別子)
aspnet_OwnerUserId(一意の識別子)
タイトル(nvarchar(50))説明(nvarchar(MAX))
StartDate(smalldatetime)
DueDate(smalldatetime)

4

4 に答える 4

4

何を達成するのかはよくわかりませんが、テーブルフィールドとして指定した内容によっては、テーブル自体との1対多の関係の方が適切だと思います。

TaskId (integer *Primary Key)
Ref_Id (integer *Foreign Key references to TaskId above)
ASPNet_OwnerUserId (integer)
Title (varchar/text)
StartDate (Date/Timestamp)
DueDate (Date/Timestamp)

サブタスクに複数の親タスクを持たせたい場合は、私が言ったことを忘れてください。とはいえ、特定の質問に対して1つ以上の回答を行うことはできますが、その逆はできません。

編集:ユーザー情報を保持する別のテーブル「aspnet_OwnerUser」があると思います。その場合は、次のSQLを確認してください。そうでなければ、それを忘れてください。;)

CREATE TABLE `aspnet_OwnerUser`
(
    `id` SERIAL PRIMARY KEY
    , `name` VARCHAR(128)
    -- further detail follows
);

CREATE TABLE `task`
(
    `id` SERIAL PRIMARY KEY
    , `ref_id` INTEGER
        CONSTRAINT REFERENCES `task`(`id`)
    , `aspnet_OwnerUserId` INTEGER
        CONSTRAINT REFERENCES `aspnet_OwnerUser`(`id`)
    , `title` VARCHAR(128) NOT NULL
    , `startdate` TIMESTAMP
    , `duedate` TIMESTAMP
);

ps上記のSQLはPostgreSQL用に作成されています。他のDBMSの場合は、自由に変更してください。

于 2010-02-01T05:28:02.280 に答える
3

交差(ジャンクション)テーブルは、2つの外部キーが同じテーブルを指しているだけで、予想どおりにコーディングされています。

create table task_subtasks
 ( master_id number not null
   , sub_id number not null
   , constraint task_subtask_pk primary key (master_id, sub_id)
    , constraint task_subtask_master_fk foreign key (master_id)
         references tasks (taskid)
    , constraint task_subtask_sub_fk foreign key (sub_id)
         references tasks (taskid)
    )
/

編集

それを入力したので、私はあなたのデータモデルに質問したいと思います。タスクが多くのサブタスクを所有できることはわかりますが、サブタスクがどのように多くのマスタータスクに属することができるかはわかりません。あなたは本当に1対多の関係を望んでいないのですか?

編集2

私がその編集を書いている間、あなたはその点に答えるためにあなたの質問を編集したのを見ます。

create table tasks (
TaskId number not null
, aspnet_OwnerUserId number not null
, subTaskId number
, Title (nvarchar(50))
, Description (nvarchar(MAX))
, StartDate (smalldatetime)
, DueDate (smalldatetime)
, constraint task_pk primary key (taskid)
, constraint sub_task_fk foreign key (subtaskid)
    references tasks (taskid)
)
/
于 2010-02-01T05:30:33.117 に答える
2

あなたのアナロジーがSOに関する質問と回答のようなものである場合、これは多対多の関係ではなく、1対多の関係です。1つの質問に複数の回答がある場合がありますが、回答は1つの質問にのみ属します。これをマッピングする最も簡単な方法は次のとおりです。

表-タスク

TaskID uniqueidentifier NOT NULL,
ParentTaskID uniqueidentifier NULL,
(other fields)

ParentTaskID次に、からへの自己参照外部キー制約を作成しTaskIDます。

何らかの理由で、本当にM:Mマッピングが必要だとしましょう。これは、マッピングテーブルを使用して実行する必要があります。自己参照M:Mは、2つのテーブルを含むM:Mと実際には何の違いもありません。

表-タスク

TaskID uniqueidentifier NOT NULL,
(other fields)

表-サブタスク

TaskID uniqueidentifier NOT NULL,
SubTaskID uniqueidentifier NOT NULL

列を参照するテーブルの両方TaskIDとに外部キー制約を配置します。これと他のM:M関係との唯一の違いは、両方の外部キー制約が同じテーブルを指していることです(一部のDBMSでは、両方をカスケードできません)。SubTaskIDSubTasksTasks (TaskID)

于 2010-02-01T05:36:40.310 に答える
1

これは多対多として行うことができますが、実際にはネストされたセットのようなものです。

于 2010-02-01T05:24:04.487 に答える