gpt4 book ai didi

javascript - 如何在规范化 SQL 中使用子数组保存和返回 JavaScript 对象

转载 作者:行者123 更新时间:2023-11-29 11:03:18 25 4
gpt4 key购买 nike

我正在使用 postgres-node,但我认为这对于任何拥有 javascript 对象的人来说都是一个问题,这些对象具有他们想要保存在 SQL 中的子数组。我有一个具有不同数量(任意长度)特征数组的 javascript 对象:

{ 
name: "Ted",
features: ['Red Hair', 'Blue Eyes']
}

所以当我有几个时,javascript 格式如下:

[
{
name: "Ted",
features: ['Red Hair', 'Blue Eyes']
},
{
name: "Ann",
features: ['Brown Hair', 'Blue Eyes', 'Big Smile']
}
]

太棒了!但是如何在规范化后从数据库中取回它呢?我已经在我的数据库中将其标准化,如下所示:

+---+------------+
|id | Name |
+---+------------+
| 1 | Ted |
| 2 | Ann |
+---+------------+

特征

+---+--------------+
|id | feature_name |
+---+--------------+
| 1 | Red Hair |
| 2 | Blue Eyes |
| 3 | Brown Hair |
| 4 | Big Smile |
+---+--------------+

people_features联结表

+---+-----------+-------------+
|id | person_id | feature_id |
+---+-----------+-------------+
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 2 | 2 |
| 4 | 2 | 3 |
| 5 | 2 | 4 |
+---+-----------+-------------+

如果我这样连接:

SELECT name, feature_name
FROM people
JOIN people_features ON people_features.person_id=people.id
JOIN features ON people_features.feature_id=features.id;

我为每个人得到一行。这不是我想要的。

我得到的:

[
{
name: "Ted",
feature_name: 'Red Hair'
},
{
name: "Ted",
feature_name: 'Blue Eyes'
},
{
name: "Ann",
feature_name: 'Blue Eyes'
},
{
name: "Ann",
feature_name: 'Brown Hair'
},
{
name: "Ann",
feature_name: 'Big Smile'
}
]

我想要的:

[
{
name: "Ted",
features: ['Red Hair', 'Blue Eyes']
},
{
name: "Ann",
features: ['Brown Hair', 'Blue Eyes', 'Big Smile']
}
]

这看起来很糟糕!现在我需要遍历这些并将相同的人组合成一个人对象。我的另一个选择似乎是向人们提出请求

SELECT id, name
FROM people;

哪个会返回:

[
{
id: 1
name: "Ted"
},
{
id: 2
name: "Ann"
}
]

然后我需要遍历并为每个人创建一个单独的 SQL 查询?

对于每个人:

SELECT feature_name
FROM features
JOIN people_features ON features.id=people_features.feature_id
WHERE people_features.person_id = $1

($1 是我要循环访问的人的 ID)

然后我会回来(给 Ted):

[
{ feature_name: 'Red Hair' },
{ feature_name: 'Blue Eyes' }
]

然后我需要从它们的对象中删除它们(只获取字符串),然后将它们添加到对象中。

其中一种是最好的方法吗?我觉得他们都非常低效。

最佳答案

应该这样做:

SELECT name, array_agg(feature_name)
FROM people
JOIN people_features ON people_features.person_id=people.id
JOIN features ON people_features.feature_id=features.id
GROUP BY people.id;

关于javascript - 如何在规范化 SQL 中使用子数组保存和返回 JavaScript 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43458174/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com