我正在使用typescript和sql实现when2meet,它应该是这样的:
它允许每个用户点击时间表来编辑他们的可用时间。
在我的方法中,应该有一个保存在sql数据库中的2d数组,该数组存储每个用户的可用时间。但我不知道如何保存它。下面是我的代码:
import { sql } from "drizzle-orm";
import {
index,
integer,
pgTable,
serial,
timestamp,
unique,
varchar,
pgEnum,
} from "drizzle-orm/pg-core";
export const availableTimeTable = pgTable(
"available_time",
{
id: serial("id").primaryKey(),
userHandle: varchar("user_handle", { length: 50 })
.notNull()
.references(() => usersTable.handle, { onDelete: "cascade" }),
tweetId: integer("tweet_id")
.notNull()
.references(() => tweetsTable.id, { onDelete: "cascade" }),
},
(table) => ({
tweetIdIndex: index("tweet_id_index").on(table.tweetId),
userHandleIndex: index("user_handle_index").on(table.userHandle),
uniqCombination: unique().on(table.userHandle, table.tweetId),
}),
);
字符串
下面是我如何从数据库中获取数据:
const availableSubquery = db.$with("available_time_count").as(
db
.select({
tweetId: availableTimeTable.tweetId,
//here is where I stuck
availableTime: sql<number[] | null>`count(*)`.mapWith(Number[]).as("available_time"),
})
.from(availableTimeTable)
.where(eq(availableTimeTable.userHandle, handle ?? "")),
);
型
另外,我想把二维数组默认为我写的数组。
我怎么能做到这一点?我是一个非常新的sql数据库。
谢谢你,谢谢
1条答案
按热度按时间kyvafyod1#
当然可以!在你的例子中,你的目标是设计一个数据库结构,将每个用户的可用时间存储在一个类似于2D数组的数据库中。需要注意的是,SQL数据库并不适合直接存储2D数组。相反,你可能需要重新构造结构,以便在关系数据库中有效地表示你的数据。
下面是在关系数据库中构造数据的常用方法:
表结构:用户表:
此表存储用户信息。时隙表:
此表将包含各个时隙及其详细信息。每行表示一个特定时隙。列可能包括time_slot_id、start_time、end_time和任何其他相关数据。用户可用性表:
此表将用户链接到其可用时隙。列可能包括user_id(引用用户表的外键)、time_slot_id(引用时隙表的外键)以及任何其他列,如状态(例如,可用或不可用)。示例SQL架构:
字符串
查询和保存数据:要插入用户可用性,您需要将条目添加到UserAvailability表中。这涉及到将用户ID与用户可用的每个时隙的时隙ID相关联。为此,您可以使用SQL SERVER语句。
为了获取用户可用性,您将使用SQL SELECT语句,通过联接必要的表来检索特定用户的可用时隙。
请记住,这是一个基本的示例,可能需要根据您的特定应用程序需求进行调整。此外,在编写SQL查询时,您应该清理和验证用户输入,以防止SQL注入漏洞。
关于TypeScript和Drizzle-ORM实现,请确保您的ORM模型设置为反映此数据库结构。然后,您将能够使用Drizzle-ORM方法执行查询,以根据这些表结构和关系与数据库进行交互。