在站点中动态创建表是一个好习惯吗?

Bac*_*ash 3 mysql best-practices

一个朋友让我用几个“静态”和“动态”表构建一个站点。

事实上,他想要一些不能删除的表,以及一些可以根据站点用户的需要直接创建的“动态”表。

IE 如果用户需要一些当前数据库中不存在的“可选”,他会为他的特定需要创建一个新表。

我认为这不是一个好方法,我认为最好在表中列出所有可能的选项,然后为每个用户标记它们,即:

garden(id, camellia, californa_poppy, azalea)包含一个普通花园,花园可以包含 3 种花卉

users(id, username, some_user_infos, garden_id)包含一个通用用户和它的花园 ID。

如果garden_id从表中值users1,与ID行1从表garden(1, 1, 0, 1)这意味着用户提供garden_id=1具有每花允许加州,但小狗。

这是我的想法。

我的朋友说最好以动态方式创建表格并将它们连接到用户以动态定义新花。

把每一种可能的花都放在garden桌子上并按照我的意愿标记它不是更好吗?

Dan*_*iel 8

简短回答:通常动态创建表和列不是一个好习惯。但是可能会有罕见的特殊情况,这是一种很好的做法。

长答案:

您可以(至少)在解决方案的以下问题上运行:

  • 一个用户只能拥有 1 个花园,因为 Garden_id 位于“users”表中。
  • 如果您想为一朵花添加更多信息,例如颜色或大小,您需要为每朵花多一列。
  • 您必须知道所有花名(列名)才能编写 sql-query。

如果我正确理解您的要求,这是交集表的情况(花卉和花园之间的多对多关系)。

也许这将解决您的需求:

创建以下表:

  • 创建一个表“Flowers”,其中包含所有可能的花,列:“Id”、“Flower”。您可以添加额外的列来描述花,例如颜色、大小、...
  • 用列“Id”、“用户名”、...创建一个表“用户”,这个表只包含用户,没有关于他的花园或花的信息。
  • 使用列“Id”、“User_Id”创建一个表“Gardens”。您可以添加描述花园的其他列,例如大小。此表包含有关花园的信息以及花园属于哪个用户。但是没有关于花园里花的信息。
  • 创建一个表“Garden_Flowers”,其中包含“Id”、“Garden_Id”、“Flower_Id”列。该表包含哪些花在哪个花园中的信息。它可能包含其他信息,例如,何时种花。

现在,您可以将新花添加到“花”表中,而无需添加新的柱子或表。您可以使用交集表“Garden_Flowers”定义哪些花在哪个花园中。只需为每朵花插入一个带有flower_id 和garden_id 的记录。