【问题标题】:Organizing Database Structure组织数据库结构
【发布时间】:2014-06-22 11:57:30
【问题描述】:
TABLE presentation {
    id BIGINT
    unique_id BIGINT
    name VARCHAR (128)
    description VARCHAR (256)
    updated_at TIMESTAMP
    created_at TIMESTAMP
}

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

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

最初,我想为presentations、layouts、positions、assets 设置一张桌子。我显然需要这个架构灵活,所以我可以添加几个新的 layouts 具有不同数量的位置。

我可以像这样创建我的presentation 表:

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
}

但这是非常短视的,并且只允许在一个演示文稿中总共有 4 个位置......但我现在正在走向更大更糟糕的事情。

或者,我以某种方式在presentations、layouts、positions 和assets 之间建立了联系,这将允许完全的灵活性......这就是我想要获得一些帮助的原因。

我不太确定我是不是想太多了……最重要的是,我真的不确定如何在这些模型之间建立正确的联系。

【问题讨论】:

  • 您是否已经在 Eloquent 中设置了模型和关系?
  • 你能指定你的模型应该如何相互关联吗?正如在演示文稿中可以有多个布局一样,一个布局可以有多个位置等。

标签: php mysql database laravel-4 eloquent


【解决方案1】:

您示例中的结构将适合子表,例如:

TABLE presentation_position {
   presentation_id (BIGINT)
   position (INT)
   asset_id (BIGINT)
}

您可以通过 id 列(或 unique_id)将其加入到演示文稿中,或者仅通过 Presentation_id 查询以获取按位置顺序排列的asset_id 值序列。比如:

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

编辑:

我从您的其他 cmets 那里对您的意图有了更好的了解。我认为您只需要一个结构来保持资产的页面位置。像这样的:

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

您还可以根据需要为框的高度、宽度等添加列。 presentation_id 和 sequence 列应该是唯一的键。所以预设 101 会有如下行:

101   1  100  100  19     //place asset 19 at 100,100
101   2  255  20   102    //place asset 102 at 255,20

【讨论】:

  • 我设想能够查询演示文稿,并在该对象内,能够在适当的位置循环或提取每个资产。
  • 啊,你使用“位置”,就像我在回答中使用“序列”一样。我会更新一点...
  • 那么您是否将layouts 渲染为无用?我绝不是在暗示我最初的想法是正确的方法......我只需要创建这种关系以便它具有可扩展性。
  • 如果你想让布局像模板一样定义可变位置,我认为你不需要它们来进行演示。它们可以用作元数据来创建新的演示文稿。希望它有助于让事情顺利进行。
  • 所以您认为没有必要为职位建立模型(这是布局的重点)?相反,只允许 UI/UX 指示位置的去向?
【解决方案2】:

正在回答

*还有很多工作要做,但需要作者提供更多意见

您的预期结构对我来说还不是很清楚,但是当您首先设置您的领域时,您将在开始考虑数据库列之前有一个草图。

如果你使用 Eloquent,它看起来像这样:

用户

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');
   }

}

位置

class Layout extends Eloquent {

   protected $table = 'positions';

    public function layout() {
       return $this->belongsTo('Layout');
   }

}

资产

class Asset extends Eloquent {

   protected $table = 'assets';

    public function layout() {
       return $this->belongsTo('Layout');
   }

}

【讨论】:

  • 是的,我只是不知道我最初的想法是否是最好的方法。我正在使用 Eloquent,所以感谢您选择这个角度。另一个问题是,目前,我的资产位于各自的表格(图像、视频、文本)中。
  • 我认为这不是问题。如果您知道要走哪条路,只需发表评论即可。我喜欢做这种事情! :)
  • 我想我想将我的资产保存在他们各自的表格中(文本、图像、视频)。但我认为我不想为layouts 和positions 的额外表格和模型而烦恼......这似乎非常多余,我什至不确定positions 表格中会包含哪些信息。因此,如果以某种方式将资产及其在演示文稿中的位置连接起来(无论是否带有布局)是有意义的,我不确定。想法?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-05
  • 2015-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-25
  • 1970-01-01
相关资源
最近更新 更多