【问题标题】:Laravel: Single or Multiple mysql tables for different Announcement typesLaravel:用于不同公告类型的单个或多个 mysql 表
【发布时间】:2017-07-31 19:34:36
【问题描述】:

祝所有阅读本文的人都好。我确实需要关于我正在从事的项目的建议。 我对 PHP 和 MySQL 编程比较陌生,听说从事项目工作是提高技能的最佳方式。

该项目是一个简单的公告项目,用户可以登录注册新公告。 现在,每个公告都基于一个类别,例如生日、婚礼、社交活动、法庭听证会等。​​

我目前正在关注的一件事是 MYSQL 表结构的外观。 例如,如果用户想要发布生日帖子,则用户点击的所有内容都是生日并填写包含相关信息的表单。如果用户想要发布婚礼帖子,则用户点击婚礼并填写包含相关信息的表单。

但是,按照我的设置方式,每个公告都有不同的数据表。 即,每种公告类型都存储在自己的表中。

例如,对于生日,我使用 BirthdaysController 创建了一个生日模型
对于婚礼,我使用 WeddingsController 创建了一个婚礼模型。
为了毕业,我用 GraduationController 创建了一个 Graduation 模型。

但有些公告具有相似的属性,例如名称、标题等。

但这意味着重复大量代码,因为它们具有相似的属性,例如生日公告很可能类似于毕业公告。

我的第一个问题是如何限制我必须创建的表的数量并减少代码,使其看起来不重复。

在我看来,我的模型和控制器太多了。更重要的是,我发现我在重复代码,在 Laracast 的“面向对象训练营”中,我清楚地记得 Jeff 说过这是一种不好的做法。 所以我真的在寻找更好的方法来做到这一点。 我知道这很长,但我确实需要帮助。

谢谢。

【问题讨论】:

  • 我认为将它们分开绝对没问题。第二个你需要添加一些关于任何公告的更具体的信息,你会很高兴你将它们分开。如果有几个字段是共享的,我认为这不足以构成一个共享这些信息的复杂系统。

标签: php mysql laravel database-design


【解决方案1】:

我个人会利用 MySQL 的关系功能(它是一个关系数据库)。

如果您可以确定每种公告类型的属性超集 - 即所有公告类型的所有属性组合到一个唯一列表中,则将此作为您的公告表。

例如

announcement_id: a unique id for each announcement. can just be an auto incremented number
announcement_date: date
announcement_type: (see below)
announcement_title: the announcement headline / title
announcement_detail: the detail text for the announcement
announcement_user: name of the person adding the announcement (think about user lists and authentication and things for this as well...)

然后添加一个公告类型表,其中包含您在公告表中允许的不同类型的公告:

announcement_type_id: a type id could just be a single letter, e.g B=Birthday, G=Graduation,W=Wedding.
announcement_type_description: a user friendly name for the announcement type, e.g Birthday, Graduation, Wedding

因此,您的两个表中的记录可能是:

类型表:

id    description
W     Wedding
B     Birthday
G     Graduation

公告表:

id    date       type  title                     detail                                                        user
1     18090212   B     Abe Lincoln's birthday    Birthday of the 16th US president                             John Doe
2     19810729   W     Royal Wedding             Wedding of Prince Charles and Diana Spencer in London   Fred Bloggs

这并不是一个完整的解决方案,但希望能给你一些想法......

【讨论】:

    【解决方案2】:

    虽然你说你是初学者,但我认为选择这样的挑战意味着你能胜任这项任务。

    您希望发布公告,其中每种类型可能(或可能不)有一些额外的列。我建议为您的所有公告创建一个表格,因为它们共享一些属性(标题、类型、描述、日期、状态等)。

    因此,您将所有常见字段放入同一个表中,然后创建一个名为“announcement_data”或“extra”之类的表或任何您想要的表。为了这个解释,我将其称为 Extra。

    Extra belongsTo Announcement & Announcement hasMany Extra。然后当你保存公告时,根据类型,你会在表单中显示一些额外的字段,例如:'witness'、'bride'等。你从控制器中获取它们

    public function save(Request $request)
    {
        $announcement = Announcement::create([
            'title' = $request->title,
            'type' => $request->type,
            ... //all common fields (description, status, date, etc.)
        ]);
    
        //save extra fields
        //according to the type of event, you should find a way to know which extra field is needed e.g:
    
        //assuming it's a wedding
        $announcement->extra()->saveMany([
            new Extra(['field' => 'bride', 'value' => $request->bride]),
            new Extra(['field' => 'groom', 'value' => $request->groom])
        ]);
    }
    

    以后如何显示你的数据?

    @foreach($announcement->extra as $extra)
        {{ $extra->field }} : {{ $extra->value }}
    @endforeach
    

    嗯,那只是通往罗马的另一条路。

    【讨论】:

    • 我在这个设计中看到的问题是a)你可能已经标准化了标题,但同时你以一种(至少)“字段”值的方式制作了所有其他属性一遍又一遍地重复练习 b)您将所有值保存为未针对许多数据类型进行优化的文本。
    猜你喜欢
    • 2017-01-23
    • 1970-01-01
    • 1970-01-01
    • 2016-05-30
    • 1970-01-01
    • 2017-12-04
    • 1970-01-01
    • 2020-08-27
    • 2021-08-15
    相关资源
    最近更新 更多