【问题标题】:Dynamically create MySql tables in PHP and keep track of them在 PHP 中动态创建 MySql 表并跟踪它们
【发布时间】:2018-10-30 08:21:04
【问题描述】:

我有一个网站,管理员将在其中管理多个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 个共享字段)对于所有项目表都是相同的,但是每个项目表将具有其特定字段(字段也将由管理员创建)

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

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

谢谢

【问题讨论】:

  • 用一张project 表来跟踪所有项目怎么样
  • 如果你为每个项目创建表,那么你可能有数百个表,所以数据库很乱。
  • @AhmedSunny 那么解决方案是什么呢?我无法为每个项目创建包含所有字段的单个表,该表很快就会变大,并且会有数百列。
  • 有几个问题你需要问自己,比如这些额外的字段是不是可以在项目创建后多次添加,还是创建后锁定?如果是第一个,也许您可​​以从 wordpress 选项中启发自己,其中选项在主表中引用,另一个表保存记录。还有,这会不会保存很多数据,你是想为了效率而阻止join,还是没那么重要?
  • 这听起来确实是个坏主意。您想解决管理员可以添加字段的问题。这样的字段可能具有三个属性:名称、值以及它是项目的一部分。你去,你有一个表来存储额外的字段,三列。如果您添加一个额外的表格来跟踪管理员添加了哪些字段,您的工作就完成了。

标签: php mysql database database-design


【解决方案1】:

正如评论中所说,我会选择三张桌子:

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

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

2:用于跟踪管理员额外添加的字段的第二个表:

fields_table (id, projectId, name)

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

values_table (id, projectId, fieldId, value)

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

您可以根据需要向表中添加列,例如created_on。你能看出这是如何工作的吗?

【讨论】:

  • 是的,这很有意义。合并第二个和第三个表是否有意义?就像添加一列“价值”?到底是一样的吗?
  • 第二个和第三个表有两个不同的功能。第二个是跟踪管理员添加的字段,而不考虑字段可能获得的任何值。第三个表专门用于这些值。您不能合并它们并以干净的方式保持这两个功能。无论如何,我认为从未知的多张桌子到只有三张是进步。 :-)
  • 哦,是的,我现在明白了。所以我认为就是这样,一切都应该只用三张桌子就可以了。非常感谢。
  • 您好,如果您不介意,请提出后续问题。您将如何管理字段的类型和值?例如,我会让管理员选择该字段的类型。将只允许 3 种类型,VARCHAR、INT 和 BOOLEAN。我在 fields_table 中添加了一个“type”列,但是我如何在 values_table 中为“value”字段反映这种类型?是否有可能,或者我必须始终将“值”列设为 VARCHAR?谢谢
  • 有几种可能的解决方案,您建议了其中一种。这根本不是一个坏主意。或者,您可以为不同类型的字段设置不同的表。这完全取决于您需要哪些类型以及您将如何处理数据。将 INT 或 BOOLEAN 存储在 VARCHAR 中的计算效率稍低,还会浪费一些文件空间,并且无法添加 BLOB 甚至长文本之类的类型。但是,使用单独的表会使您的查询更加复杂。所以这一切都取决于。
【解决方案2】:

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

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

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

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

我猜你可能会觉得它很有用。

【讨论】:

  • 所以基本上为每个项目创建一个包含项目特定字段的表,然后将其与主表连接,对吧?
  • 没错,对你有很大帮助
猜你喜欢
  • 1970-01-01
  • 2014-07-18
  • 1970-01-01
  • 1970-01-01
  • 2012-09-26
  • 1970-01-01
  • 2011-09-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多