在PHP中动态创建MySql表并对其进行跟踪

时间:2018-10-30 08:21:04

标签: php mysql database database-design

我有一个网站,管理员可以在其中管理多个projects

就结构而言,project只是数据库中的一个表。所有项目将共享某些字段,但始终具有与所有其他项目不同的其他字段。该表将保存有关文档的信息。

我的问题是找到描述此问题的最佳方法。由于管理员可以创建任意数量的项目,因此我想为他创建的每个项目创建一个新表。最初,所有表都将具有相同的字段,但是我将允许管理员为每个项目表创建字段。

是否有更好的方法?还是创建一个只包含特定项目字段的表,然后将其与具有所有公共字段的主表连接起来更好?

我的解决方案是为每个项目创建一个表,如下所示:

table_project1(id, title, created_on, project1_field1, project1_field2, ...)
table_project2(id, title, created_on, project2_field1, project2_field2, ...)

以此类推。

在此示例中,idtitlecreated_on字段(实际上有大约10个共享字段)对于所有项目表都是相同的,但是每个项目表都会有其特定字段(这些字段也将由管理员创建)

另一个问题是管理员将动态创建的所有字段,我还必须能够搜索它们,因此我需要跟踪这些创建的字段。

什么是最好或更好的解决方案?

谢谢

2 个答案:

答案 0 :(得分:2)

如评论中所述,我将使用三个表:

1:您的主项目表中的字段始终存在:

const sort = (arr1, arr2) => {
  const res = [];
  arr1.forEach(v => {
    const toPush = arr2.find(w => w.value === v.value);
    if (toPush)
      res.push(toPush);
  });
  return [...res, ...arr2.filter(w => res.every(v => v.value !== w.value))];
}

2:第二个表,用于跟踪管理员添加的其他字段:

projects_table (id, title, created_on, project1_field1, project1_field2, ...)

3:第三个表跟踪添加字段的值:

fields_table (id, projectId, name)

请注意,第三表中的values_table (id, projectId, fieldId, value) 并不是必需的,因为第二表中已经存在projectId。是否要添加这样的多余字段取决于您要对数据执行的操作以及可能存在的效率问题。

您可以根据需要向表中添加列,例如created_on。您能看到它如何工作吗?

答案 1 :(得分:1)

由于您已在项目之间共享字段,因此建议您将它们放在一个表中 如下所示:

Projects (id, title, created_on, ..., additional_fields_table_name)

请注意,我添加了一个名为additional_fields_table_name的自定义共享字段,该字段将存储表的名称,其中将包含表的名称,您可以在其中找到与此项目相关的字段。

例如: 您创建了一个名为Dev-1的项目,然后为其创建了其他字段,该项目将存储在类似Dev_1_additional_fields的地方,它们将使用id作为主/外键进行链接。

我想您可能会发现它有用。