【问题标题】:SQL variable containing a list包含列表的 SQL 变量
【发布时间】:2020-04-12 08:55:03
【问题描述】:

假设我有两个表:cakesdudes

json 中的一行cakes 如下所示:

{
    "id" : 0,
    "name" : "Carrot cake",
    "slices" : 8,
    "eaten_by" : ?
}

json 中的一行dudes 如下所示:

{
    "id" : 0,
    "name" : "Ahsoka"
}

eaten_by 变量中,我想记录每个吃过蛋糕的人。
例如,json 结果将是:

{
    "id" : 0,
    "name" : "Carrot Cake",
    "slices" : 8,
    "eaten_by" : {
        {
            "id" : 0,
            "name" : "Ahsoka"
        },
        {
            "id" : 3,
            "name" : "CT-7567 Rex"
        },
        {
            "id" : 9,
            "name" : "CC-2224 Cody"
        },
    }
}

我对SQL很陌生,我已经搜索了一下,但我什至不知道这种“嵌套列表”是如何调用的。

我的备份解决方案是创建一个像这样的元组:"eaten_by" : (0, 3, 9),其中包含伙计们的 ID,这样我以后可以通过另一个电话找到他们;但元组似乎在 SQL 中不存在。
我也想过这个:"eaten_by" : "0, 3, 9",但我的直觉告诉我这是一种非常粗暴的做法。

有人可以帮我吗? (或者只告诉我这个的名字以便我能找到它?)

编辑:每个dude 最多只能得到 1 片蛋糕。

【问题讨论】:

    标签: python sql sqlite flask


    【解决方案1】:

    我们极力避免在表格列中嵌套列表。相反,我们依赖于规范化我们的数据。在这种情况下,您将需要第三个表来保存 cakesdudes 之间的关系:

    餐桌cake_eaters

     cake_id | dude_id
      0      |  3
      0      |  9
      0      |  0
    

    现在我们加入以获得您的结果集:

    SELECT *
    FROM cakes
        INNER JOIN cake_eaters ON cakes.id = cake_eaters.cake_id
        INNER JOIN dudes ON cake_eaters.dude_id = dudes.id
    

    (例如)

    相反,如果您决定将 json 或逗号分隔列表或其他内容填充到您的 eaten_by 列中,您将遇到无法在该列表/json/array 上加入 dudes 的问题。您必须首先将列表解析为一种临时表(如cake_eaters)并对其进行连接,这将是非常昂贵的 I/O 和内存。另外,您无法在其上维护任何索引,因此它的规模也会很慢。

    如果您预计要做大量工作来决定应用程序的数据库架构/设计,我建议您阅读“数据库规范化”。网上有很多关于这个主题的文章,它将帮助您思考良好的 RDBMS 设计实践以及您应该避免的设计。

    【讨论】:

    • 感谢您的帮助!我正在考虑这第三张桌子。每次有人吃一片,我都需要插入一个新条目,对吗?如果我想获得一份蛋糕及其食客的列表,我需要打 2 个电话(1 个给 cakes,1 个给 cake_eaters)还是一个简单的 cake_eaters 调用就足够了?
    • 没错。每次一个家伙吃他们以前没有吃过的蛋糕时,您都需要在此关系表中添加一个新条目。如果您将表视为具有“属性”的“对象”,那么您可以想象关系实际上是一个对象。它甚至具有属性。例如,您可以考虑添加一个名为 date_eaten 的列。每个“对象”通常都有自己的表来存储其特定属性。至于你的第二个问题,你可以打一个电话,然后JOIN 把桌子放在一起。我上面的SELECT * 在这个假设的模式中回答了你的确切问题。
    • 谢谢@JNevill!我已经编辑了我的问题。我试过你的解决方案。这是一个很大的进步,但它并没有给我想要的确切结果。不知道是解析问题还是sql调用问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2019-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-25
    相关资源
    最近更新 更多