数据库模式多对多(默认)

时间:2018-09-10 23:24:47

标签: mysql laravel database-design many-to-many pivot-table

我希望有人愿意看看这种多对多关系。这个示例是针对Laravel项目的,但具体细节并不重要。

动作

+----+------+--------+-------------+------+--------+------------+
| id | name | script | description | icon | custom | project_id |
+----+------+--------+-------------+------+--------+------------+

管道(action_server 这是数据透视表

+----+-----------+-----------+-------+
| id | action_id | server_id | order |
+----+-----------+-----------+-------+

服务器

+----+------+------------+------------+
| id | name | ip_address | project_id |
+----+------+------------+------------+

多对多关系用于部署服务器,操作是部署管道中的一部分。

  • 一个动作可以在多个服务器上执行。
  • 用户可以使用自定义脚本添加操作。
  • 可以通过project_id
  • 获取部署管道的所有操作

此概念在Laravel中有效,我可以根据给定的project_id来获取我的操作。反过来,我可以使用action->servers()获取运行部署所需的服务器操作。

我需要一种添加默认动作的方法。我希望能够为操作提供带有预定义脚本的功能,以供用户从部署管道中选择和添加,而不是始终使用由用户提供的脚本。

这些预定义的操作无法填充到action表中,因为在那里定义的操作已绑定到project_id中。这些必须是通用的。

我不能在当前设置中为这些预定义操作简单地创建另一个表,因为管道中的action_id已经使用外键设置了。

到目前为止,感觉就像我在混两个概念,分别是pre-defined操作和用户自己创建的user-defined操作。它们需要处于同一管道中,并最终以正确的顺序运行。

关于如何实现此目标的任何想法?我愿意接受所有建议。

修改

将其绘制出来之后,似乎可行的解决方案是以action_project的形式添加另一个数据透视表,这使我可以将project_idaction表中解耦(删除) 。我想知道如何在Laravel中保持这种状态。

action_project

+----+-----------+------------+
| id | action_id | project_id |
+----+-----------+------------+

1 个答案:

答案 0 :(得分:1)

以概念性方式总结您的问题:

  1. 应用 (“项目”)具有关联的 自定义操作
  2. 没有为特定的应用程序 定义
  3. 标准操作
  4. 服务器 具有/托管应用
  5. 管道 定义按哪个顺序在哪个服务器上执行哪些“操作”

我认为您所需要的只是自定义操作标准操作的概括,对应于包含这两种情况的超类“操作”。这将导致以下表格:

  1. const CMInputField = ({label, value, onChange, rows, margin, style}, context) => { let textFieldStyle = {"marginTop":0, "marginBottom":35}; if(firstOfType) textFieldStyle= {"marginTop":15, "marginBottom":35}; return ( <TextField label={context.t(label)} value={value} onChange={onChange} InputLabelProps={{shrink: true}} style={textFieldStyle} //the defaulted one fullWidth multiline rows={rows} margin={margin}/> ); }; <CMInputField label="First Input" value="Hello" onChange={this.myFunction} firstOfType={true}/> <CMInputField label="Second Input" value="Hello Again" onChange={this.myFunction2} firstOfType={false}/> ,其中actions(id, type, name, description)typecustom
  2. standard

或者,您可以将custom_actions(id, script, icon, custom, project_id)的属性附加到custom_actions,对于标准操作 ,它们都为NULL。