【问题标题】:Having SQL Automatically Create a Table让 SQL 自动创建表
【发布时间】:2015-01-19 02:39:44
【问题描述】:

我是数据库新手,需要一些帮助。我的数据库中有一张表,其中包含有关所有事件的信息。例如,有几行,每行描述一个不同的事件。

现在,我还需要跟踪参加活动的用户。那么我该如何设计呢?我在想,如果有某种方式,每次将新行添加到事件表时,都会专门为该事件创建一个新表。那有可能吗?还是只在主要事件表中添加一列,参加人员的姓名用逗号或分号或其他东西分隔是个好主意?还是为每个用户制作一个表格,每一行都是参加的活动更好?

提前致谢。

【问题讨论】:

    标签: mysql sql database database-design


    【解决方案1】:

    这样做的更好方法是使用以下内容:

    Create table events( 
       id integer,
       <OTHER EVENT DETAILS HERE (i.e. start time, location, duration etc>
       primary key (event_id)
    );
    
    Create table users(
       id integer,
       <OTHER USER DETAILS HERE (i.e. name, email, phone etc)>
       primary key (user_id)
    );
    
    CREATE TABLE event_users(
       event_id integer,
       user_id integer,
       <OTHER USER/EVENT DETAILS HERE (i.e. ticket price paid etc)>
       Primary Key (event_id,user_id), 
       Foreign Key (event_id) REFERENCES events(id),
       Foreign Key (user_id) REFERENCES users(id)
    );
    

    这样活动可以有 0 个或多个用户参加,用户可以参加 0 个或多个活动,您不需要创建更多表格。

    然后您获取数据的方式类似于:

    SELECT U.id
    FROM User U, UserEvent UE
    WHERE U.id = UE.user_id
    AND UE.event_id = <event id you want to search for>;
    

    【讨论】:

    • 很抱歉这么晚才问这个问题,但是您将如何向 event_users 表添加行?我可以只执行“INSERT INTO event_users VALUES(123, 123)”吗?还是有什么不同?
    • 没错,是标准插入。唯一要记住的是“event_id”和“user_id”是外键,这意味着您不能为这两个字段插入任何值,而这两个字段分别不存在于“events”和“users”表中。
    • 啊,非常好。所以假设我删除了一个用户。他也会从 event_users 表中消失吗?
    • 您需要为此设置具有级联删除功能的表。这两页很有趣:stackoverflow.com/questions/59297/…dba.stackexchange.com/questions/44956/…
    【解决方案2】:

    ...在主事件表中添加一列是否是个好主意,参加者的姓名用逗号或分号或其他东西分隔?

    嗯,您可能想先阅读joins,这将有助于处理表之间的关系。您将创建一个事件表和一个带有relational table 的用户表,以跟踪哪些用户参与了哪些事件。这样你就不必有一个逗号用户列表(它根本表现不佳)。

    我建议你有一个事件表,它在不同的表中有一个类型,我打赌每个事件将包含相同的信息,所以它才有意义。

    动态创建表格只会造成混乱和复杂性,我认为您在这里无法证明这一点。

    【讨论】:

      【解决方案3】:

      听起来您正在映射多对多关系。每个用户可以参加一个或多个活动,每个活动可以有 1 个或多个用户。 一种选择是拥有三个表。 表 1:事件,描述了每个事件。 表 2:用户,描述每个用户 表 3:EventUsers,这将是一个中间表。该表至少有两列:Events 的主键和 Users 的主键。

      【讨论】:

        猜你喜欢
        • 2014-02-05
        • 2021-04-01
        • 2019-04-27
        • 1970-01-01
        • 1970-01-01
        • 2021-09-30
        • 1970-01-01
        • 2012-06-21
        • 2022-01-06
        相关资源
        最近更新 更多