【问题标题】:How to store an array in an SQL table?如何在 SQL 表中存储数组?
【发布时间】:2016-04-28 19:37:34
【问题描述】:

我知道您可以在 SQL 中使用外键“引用”另一个表,这将在表 1(FK)中的该条目和表 2 中的主键之间建立连接。

我想扩展这个概念,以便有 n 个“表 2”。

我手头的任务是表1表示任务列表,表2是任务本身,我想为每个任务列表存储n个这样的任务。

我专门使用 postgres,但我想知道普通 SQL 中的答案(这样更容易理解)。

【问题讨论】:

  • 这个问题对我来说没有任何努力。你试过什么?如果答案是 nothing,请查看 tour 并在 w3schools 学习。
  • 这对我来说是一个新概念,我正在寻找一些指针。是的,我读过一些书,但我的老板正在逼迫我。
  • 看看 [w3schools.com/sql] 是真正的基础知识。也许直接跳到约束
  • @inetphantom 检查了,没有太大帮助。不管怎么说,还是要谢谢你。所有这些都是我已经知道的东西(pk,fk,unique,check,default)。
  • 我发现的一个相关问题:stackoverflow.com/questions/6360739/…

标签: sql postgresql


【解决方案1】:

我想扩展这个概念,以便有 n 个“表 2”。

我手头的任务是表 1 表示任务列表,并且 表2是任务本身,我想为每个存储n个这样的任务 任务列表。

反过来想。

每个task(table2) 必须具有表 1 中相应 PK 的 FK。并且可能有许多任务引用表 1 中的相同 PK(这基本上是您的“任务列表”)。

这是1:N 关系。并且 FK 应该设计在关系的“N 侧”而不是“1 侧”。

【讨论】:

  • cwallenpoole 在这个问题的选定答案中说了什么? stackoverflow.com/questions/6360739/… 我的实现中是否需要类似的映射表?
  • 不,您需要N:M-Relationships 的映射表。对于1:N 关系,将FK 放在N-side 的表中就足够且可取的了,N-side 引用了1-side 上另一个表中的(一个)相应数据行。
  • 只要单个任务始终属于 一个 特定任务列表,您在此处就有 1:N 关系。
  • 至少了解ER diagrams 的基础知识是非常必要的。那么如何做好事就很直接了,normalized database design
  • 我同意。现在我已经创建了表,我意识到我实际上需要三个表:表 1 是一个任务列表表,第二个是 list_to_task 的映射,第三个是任务表。它有点像1:N:N^2,即列表列表。两者之间的差异让我整个星期都感到困惑。
【解决方案2】:

关系数据库基于关系。所以,让我们先创建表。

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

TaskList ID 是主键。任务 ID 是任务表的外键。任务编号是用户分配给任务的编号。任务优先级是用户分配给任务的优先级。

我们有 2 个表,因此我们可以将任务与 TaskList 表中的时间顺序分开。当您执行重复任务时,我们还可以节省一点空间。

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 表和 Task 表中写入一行。

当您加入 TaskList 和 Task 表并选择多行时,您会创建一个 Task 实例列表。

【讨论】:

  • TaskList ID is the primary key. Task ID is a foreign key to the Task table. ... 这意味着每个列表只能有一个任务。您需要 (tasklist_id,task_number) 上的复合主键,或者:请参阅其他答案。
  • @joop 我最终创建了第三个从任务列表映射到任务的表。它只包含自己的 PK 和主 task_lists 表的 FK。
  • @Gilbert 这是 JPA 还是 Java?如果是 JPA,我不需要注释吗?
  • @cst1992:我在想一个普通的旧 java 对象。
猜你喜欢
  • 1970-01-01
  • 2020-04-10
  • 1970-01-01
  • 1970-01-01
  • 2021-07-31
  • 2014-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多