postgresql 如何将数据表保存到sql(pgTable)中?

sz81bmfz  于 2023-11-18  发布在  PostgreSQL
关注(0)|答案(1)|浏览(205)

我正在使用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数据库。
谢谢你,谢谢

kyvafyod

kyvafyod1#

当然可以!在你的例子中,你的目标是设计一个数据库结构,将每个用户的可用时间存储在一个类似于2D数组的数据库中。需要注意的是,SQL数据库并不适合直接存储2D数组。相反,你可能需要重新构造结构,以便在关系数据库中有效地表示你的数据。
下面是在关系数据库中构造数据的常用方法:
表结构:用户表:
此表存储用户信息。时隙表:
此表将包含各个时隙及其详细信息。每行表示一个特定时隙。列可能包括time_slot_id、start_time、end_time和任何其他相关数据。用户可用性表:
此表将用户链接到其可用时隙。列可能包括user_id(引用用户表的外键)、time_slot_id(引用时隙表的外键)以及任何其他列,如状态(例如,可用或不可用)。示例SQL架构:

CREATE TABLE User (
  user_id SERIAL PRIMARY KEY,
  username VARCHAR(50) NOT NULL
);

CREATE TABLE TimeSlot (
  time_slot_id SERIAL PRIMARY KEY,
  start_time TIMESTAMP NOT NULL,
  end_time TIMESTAMP NOT NULL
);

CREATE TABLE UserAvailability (
  user_id INT REFERENCES User(user_id),
  time_slot_id INT REFERENCES TimeSlot(time_slot_id),
  status VARCHAR(20), -- e.g., 'available', 'busy', etc.
  PRIMARY KEY (user_id, time_slot_id)
);

字符串
查询和保存数据:要插入用户可用性,您需要将条目添加到UserAvailability表中。这涉及到将用户ID与用户可用的每个时隙的时隙ID相关联。为此,您可以使用SQL SERVER语句。
为了获取用户可用性,您将使用SQL SELECT语句,通过联接必要的表来检索特定用户的可用时隙。
请记住,这是一个基本的示例,可能需要根据您的特定应用程序需求进行调整。此外,在编写SQL查询时,您应该清理和验证用户输入,以防止SQL注入漏洞。
关于TypeScript和Drizzle-ORM实现,请确保您的ORM模型设置为反映此数据库结构。然后,您将能够使用Drizzle-ORM方法执行查询,以根据这些表结构和关系与数据库进行交互。

相关问题