Php 组织数据库结构

Php 组织数据库结构,php,mysql,database,laravel-4,eloquent,Php,Mysql,Database,Laravel 4,Eloquent,我正在创建一个允许用户创建演示文稿的应用程序。每个演示文稿都构建在一个布局中,每个布局包含多个位置,每个位置都由一个资源(文本、图像、视频)占据 我正试图找出在我的演示、布局和资产之间建立联系的最佳方式 最初,我想为演示文稿,布局,位置,资产建立一个表格。显然,我需要这个模式是灵活的,因此我可以添加几个新的布局,具有不同数量的位置 我可以这样创建我的演示文稿表: TABLE presentation { id BIGINT unique_id BIGINT name VA

我正在创建一个允许用户创建演示文稿的应用程序。每个演示文稿都构建在一个布局中,每个布局包含多个位置,每个位置都由一个资源(文本、图像、视频)占据

我正试图找出在我的演示、布局和资产之间建立联系的最佳方式

最初,我想为
演示文稿
布局
位置
资产
建立一个表格。显然,我需要这个模式是灵活的,因此我可以添加几个新的
布局
,具有不同数量的位置

我可以这样创建我的
演示文稿
表:

TABLE presentation {
    id BIGINT
    unique_id BIGINT
    name VARCHAR (128)
    description VARCHAR (256)
    updated_at TIMESTAMP
    created_at TIMESTAMP
}
但这是非常短视的,在一次演讲中只允许总共4个位置。。。但我现在已经在去更大更坏的地方的路上了

或者,我以某种方式在
演示文稿
布局
位置
资产
之间建立了一种联系,从而实现了完全的灵活性。。。这就是我想要得到帮助的地方


我不太确定我是不是想得太多了,还是。。。底线是,我真的不确定如何在这些模型之间建立正确的连接。

您示例中的结构适合于类似以下内容的子表:

TABLE presentation {
    id BIGINT
    unique_id BIGINT
    name VARCHAR (128)
    description VARCHAR (256)
    position1 (BIGINT) - would contain an asset_id
    position2 (BIGINT) - would contain an asset_id
    position3 (BIGINT) - would contain an asset_id
    position4 (BIGINT) - would contain an asset_id
    updated_at TIMESTAMP
    created_at TIMESTAMP
}
TABLE presentation_position {
   presentation_id (BIGINT)
   position (INT)
   asset_id (BIGINT)
}
您可以通过id列(或唯一id)将其连接到presentation,也可以通过presentation id查询,以按位置顺序获取资产id值序列。比如:

TABLE presentation {
    id BIGINT
    unique_id BIGINT
    name VARCHAR (128)
    description VARCHAR (256)
    position1 (BIGINT) - would contain an asset_id
    position2 (BIGINT) - would contain an asset_id
    position3 (BIGINT) - would contain an asset_id
    position4 (BIGINT) - would contain an asset_id
    updated_at TIMESTAMP
    created_at TIMESTAMP
}
TABLE presentation_position {
   presentation_id (BIGINT)
   position (INT)
   asset_id (BIGINT)
}
编辑:

从你的其他评论中,我对你的意图有了更好的了解。我认为您只需要一个结构来保持资产的页面位置。大概是这样的:

select position, asset_id from presentation_position where presentation_id = 555 order by position 
还可以根据需要为框的高度、宽度等添加列。presentation_id和sequence列应该是唯一的键。因此,预设101将有如下行:

TABLE presentation_element {
   presentation_id (BIGINT)
   sequence (INT)
   xpos (INT)
   ypos (INT)
   asset_id (BIGINT)
}

正在回答问题

*仍有工作要做,但需要作者提供更多的投入

我还不太清楚您的预期结构,但当您首先设置房地产时,在开始考虑数据库列之前,您将有一个草图

如果您使用的是Elount,它将如下所示:

select position, asset_id from presentation_position where presentation_id = 555 order by position 
使用者

介绍

class User extends Eloquent {

   protected $table = 'users';

    public function presentations() {
       return $this->hasMany('Presentation');
   }

}
布局

class Presentation extends Eloquent {

   protected $table = 'presentations';

    public function user() {
       return $this->belongsTo('User');
   }

}
位置

class Layout extends Eloquent {

   protected $table = 'layouts';

    public function positions() {
       return $this->hasMany('Position');
   }

}
资产


我设想能够查询一个演示文稿,并且在该对象中,能够循环或提取其适当位置的每个资产。啊,您使用的是“位置”,就像我在回答中使用的“序列”。我会更新一点…那么您的示例是否会使
布局
无用?我并不是说我最初的想法是正确的。。。我只需要创建这种关系,这样它就可以伸缩。如果你想让版面像模板一样定义可变位置,我想你不需要它们来做演示。它们可以用作元数据来创建新的演示文稿。希望它有助于让球滚动。所以你不认为有必要为位置建立一个模型(这是布局的要点)?相反,只需让用户界面/用户体验决定位置的走向?您是否已经以雄辩的方式设置了您的模型和关系?您是否可以指定您的模型应该如何相互关联?因为在一个演示文稿中可以有很多布局,一个布局可以有很多位置等等。是的,我只是不知道我最初的想法是否是最好的方法。我用的是雄辩,所以谢谢你从这个角度出发。另一个问题是,目前,我的资产都在各自的表(图像、视频、文本)中。我认为这不一定是个问题。如果你知道你想走哪条路,就发表评论吧。我喜欢做这种事!:)我想我希望将我的资产保存在各自的表中(文本、图像、视频)。但是我不想为
布局
位置
的额外表格和模型操心。。。它似乎非常冗余,我甚至不确定
位置
表中会包含哪些信息。因此,如果在演示文稿中连接资产和它们的位置(无论是否使用布局)有意义,我不确定。思想?