2016-01-22 32 views
0

我知道你可以在SQL中使用外鍵「引用」另一個表,這將在表1中的該條目(FK)和表2中的主鍵之間建立連接。如何將數組存儲在SQL表中?

我想擴展這個概念使n有'表2'。

我手邊的任務是表1表示任務列表,表2表示任務本身,我想爲每個任務列表存儲n個這樣的任務。

我特別使用postgres,但我想知道在香草SQL中的答案(以便更容易理解)。

+0

這個問題並沒有爲我顯示任何的努力。你有什麼嘗試?如果答案是「沒有」,請查看w3schools上的[巡迴]和搜索結果。 – inetphantom

+0

這是一個新概念,我正在尋找一些指針。是的,我已經看過一些書,但是我的老闆對我不利。 – cst1992

+0

看看[http://www.w3schools.com/sql]是真正的基礎知識。也許直接跳過去約束 – inetphantom

回答

3

我想擴展這個概念,以便有n個表2。

我手邊的任務是表1表示任務列表,而 表2是任務本身,我想爲每個 任務列表存儲n個這樣的任務。

想想它的另一種方式。

每個task(表2)必須具有表1中相應PK的FK。並且可能有許多任務引用表1中的相同PK(那麼基本上是您的「任務列表」)。

這是一個1:N的關係。 FK應該設計在「N側」,而不是在關係的「單側」。

+0

在這個問題的選定答案中,什麼是cwallenpoole? http://stackoverflow.com/questions/6360739/how-to-store-array-or-multiple-values-in-one-column?rq=1我的執行過程中是否需要一個類似的映射表? – cst1992

+0

不,你需要一個映射表用於'N:M'-關係。對於'1:N'關係來說,將FK放在'N-side'的表格中是足夠的並且是可取的,該'N-side'參考在「單面」的另一個表格中的(一個)對應的數據行。 –

+0

只要一個任務總是屬於* one *特定的任務列表,那麼這裏就有一個'1:N'的關係。 –

0

關係數據庫基於關係。所以,我們先創建表格。

TaskList 
-------- 
TaskList ID 
Task ID 
Task Number 
Task Priority 
Start Time Stamp 
End Time Stamp 
... 

TaskList ID是主鍵。任務ID是任務表的外鍵。任務編號是用戶分配給該任務的編號。任務優先級是用戶分配給任務的優先級。

我們有2個表格,所以我們可以在任務列表表格中將任務與其時間順序分開。當您重複執行任務時,我們也可以節省一點空間。

Task 
---- 
Task ID 
Task Description 
... 

在Java中,我們沒有關係。我們有物體。所以,爲任務創建一個Java對象是很好的。

package com.ggl.testing; 

import java.util.Calendar; 

public class Task { 

    private int taskNumber; 
    private int taskPriority; 

    private Calendar startTimestamp; 
    private Calendar finishTimestamp; 

    private String description; 

    public int getTaskNumber() { 
     return taskNumber; 
    } 

    public void setTaskNumber(int taskNumber) { 
     this.taskNumber = taskNumber; 
    } 

    public int getTaskPriority() { 
     return taskPriority; 
    } 

    public void setTaskPriority(int taskPriority) { 
     this.taskPriority = taskPriority; 
    } 

    public Calendar getStartTimestamp() { 
     return startTimestamp; 
    } 

    public void setStartTimestamp(Calendar startTimestamp) { 
     this.startTimestamp = startTimestamp; 
    } 

    public Calendar getFinishTimestamp() { 
     return finishTimestamp; 
    } 

    public void setFinishTimestamp(Calendar finishTimestamp) { 
     this.finishTimestamp = finishTimestamp; 
    } 

    public String getDescription() { 
     return description; 
    } 

    public void setDescription(String description) { 
     this.description = description; 
    } 

} 

正如您所看到的,您必須閱讀TaskList表和Task表才能創建Task對象。當用戶創建一個新的Task對象時,你必須寫一行到TaskList表和任務表。

當您加入任務列表和任務表時,您可以創建一個任務實例列表,並選擇多行。

+0

'TaskList ID是主鍵。任務ID是任務表的外鍵。 ......這意味着每個列表只能有一個任務。您需要(tasklist_id,task_number)上的組合主鍵,或者:查看其他答案。 – joop

+0

@joop我最終創建了第三個從tasklists映射到任務的表。它只包含自己的PK和FK到主'task_lists'表。 – cst1992

+0

@Gilbert是JPA還是Java?如果JPA,我不需要註釋嗎? – cst1992