使用许多外键在MySql中创建大表

时间:2018-07-11 22:30:17

标签: php mysql sql laravel laravel-5

我正在创建一个应用程序,其中必须保存有关用户教育的信息 然后我要向他们展示。 每个用户可以接受1、2或更多的教育。 我正在使用laravel模式构建器创建此表。这是代码

    Schema::create('educations', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('user_id')->unsigned();
        $table->date('from')->nullable();
        $table->date('to')->nullable();
        $table->integer('country_id')->unsigned();
        $table->integer('city_id')->unsigned();
        $table->integer('university_id')->unsigned();
        $table->integer('faculty_id')->unsigned()->nullable();
        $table->integer('speciality_id')->unsigned()->nullable();
        $table->integer('degree_id')->unsigned()->nullable();
        $table->string('image', 100)->nullable();
        $table->text('additional')->nullable();


        $table->index('university_id');
        $table->index('faculty_id');
        $table->index('country_id');
        $table->index('city_id');
        $table->index('degree_id');
        $table->index('speciality_id');


        $table->foreign('user_id')
            ->references('id')->on('users')
            ->onDelete('cascade');

        $table->foreign('faculty_id')
            ->references('id')->on('faculties')
            ->onDelete('cascade');

        $table->foreign('degree_id')
            ->references('id')->on('degrees')
            ->onDelete('cascade');

        $table->foreign('speciality_id')
            ->references('id')->on('specialities')
            ->onDelete('cascade');

        $table->foreign('university_id')
            ->references('id')->on('universities')
            ->onDelete('cascade');

        $table->foreign('country_id')
            ->references('id')->on('countries')
            ->onDelete('cascade');

        $table->foreign('city_id')
            ->references('id')->on('cities')
            ->onDelete('cascade');
    });

MySql代码:

CREATE TABLE `educations` 
( 
    `id`            INT UNSIGNED NOT NULL auto_increment PRIMARY KEY, 
    `user_id`       INT UNSIGNED NOT NULL, 
    `from`          DATE NULL, 
    `to`            DATE NULL, 
    `country_id`    INT UNSIGNED NOT NULL, 
    `city_id`       INT UNSIGNED NOT NULL, 
    `university_id` INT UNSIGNED NOT NULL, 
    `faculty_id`    INT UNSIGNED NULL, 
    `speciality_id` INT UNSIGNED NULL, 
    `degree_id`     INT UNSIGNED NULL, 
    `image`         VARCHAR(100) NULL, 
    `additional`    TEXT NULL 
) 

DEFAULT CHARACTER SET utf8mb4 COLLATE 'utf8mb4_unicode_ci') 

所以我有一个问题: 当我想获得一个用户的所有教育时,我要在将近7个表上运行join或使用laravel查询生成器并在页面加载时运行许多查询。 我的数据库设计正确吗?

我在每一列上使用外键的原因是用户必须从数据库的变量列表中选择其学院,大学,专业等。

任何答案都会有所帮助。谢谢。

1 个答案:

答案 0 :(得分:1)

  

我相信我可以在这些关系结构背后看到您的想法,但是   以我的拙见,它们不是很正确,因为我觉得   在某些情况下,列条目与每个条目都不直接相关   其他。我会给你一些例子:

     
      
  1. 您的表名称是“教育”。 1位用户已经接受过几次教育   但不仅为1个用户保留1个教育。所以这是一个   n:m-relation,这就是为什么您需要1个表的原因   '教育','1'代表'users',中间有1张桌子   例如,“ user_has_got_education”。您的外键落在   后一个带有user_id和education_id的表。
  2.   
  3. country_id,city_id,University_id,faculty_id与教育没有直接关系。创建一个名为“ countries”(country_id,   country_name,country_population,country_code,.....),然后创建一个   表格以同样的方式称为“城市”。在这里得到更多   之所以困难是因为一个city_id不一定像那里一样   可能是带有city_name ='London'的两个city_id,其中一个是   伦敦(英国),一个到伦敦(美国,俄亥俄州),另一个到伦敦(美国,肯塔基州)。   因此,您需要的是至少与“国家/地区”的表关系   AND州/县/郡-甚至可能还不够(如果有的话)   例如在俄亥俄州的美国有2个城市称为“伦敦”。   我称之为“直接关系”。简而言之,您的列(外键)放在错误的位置,它们属于“直接连接的兄弟表”,而不属于“侄子表”。
  4.   
     

尝试从逻辑上直接获得   关联到另一个表并相应地“连接”表。   我希望能有所帮助,不过在这里不能真正给您提供完整的表格结构。