Php 选择哪种数据类型以及如何在脚本上实现它(多对多关系)

Php 选择哪种数据类型以及如何在脚本上实现它(多对多关系),php,database,database-design,Php,Database,Database Design,我有一个表单,用户必须使用复选框选择大量设施。我想将每个复选框保存为ENUM('0','1')数据类型是facilities_表,然后在我的视图中显示它们,如下所示: <?php $jacuzzi = $facilities['jacuzzi'] == 1?"jacuzzi available":"jacuzzi not available"; ?> 我想知道这是不是最好的方法 提前感谢。如果您有一个用户表和一个设施表,那么您必须将其保存在用户设施表中,以使所有内容正常

我有一个表单,用户必须使用复选框选择大量设施。我想将每个复选框保存为ENUM('0','1')数据类型是facilities_表,然后在我的视图中显示它们,如下所示:

<?php
   $jacuzzi =  $facilities['jacuzzi'] == 1?"jacuzzi available":"jacuzzi not available";
?>

我想知道这是不是最好的方法


提前感谢。

如果您有一个用户表和一个设施表,那么您必须将其保存在用户设施表中,以使所有内容正常化。

如果您有一个用户表和设施表,那么您必须将其保存在用户设施表中,以使所有内容正常化。

我通常使用TINYINT(1)具有以下定义的列:

`MyBooleanColumn` TINYINT(1) UNSIGNED DEFAULT 0
我不知道这是否有任何形式的性能优势,但它允许您执行2个以上的值,可能会达到255,因为TINYINT是一个字节。但我认为枚举字段需要不止一个字节

这就是说,如果您正试图将多个
设施
与多个
用户
连接起来,那么这样的事情也许是正确的

CREATE TABLE `facilities_users` (
  `facility_id` BIGINT() UNSIGNED NOT NULL COMMENT 'foreign key -> facilities.id',
  `user_id` BIGINT() UNSIGNED NOT NULL COMMENT 'foreign key -> users.id',
)
通过上表,您可以加入并获得用户想要的设施列表。您甚至不需要存储布尔值,因为此表中存在一行,该行的设备id将其链接到用户,这意味着他们选择了该行。

我通常使用具有以下定义的TINYINT(1)列:

`MyBooleanColumn` TINYINT(1) UNSIGNED DEFAULT 0
我不知道这是否有任何形式的性能优势,但它允许您执行2个以上的值,可能会达到255,因为TINYINT是一个字节。但我认为枚举字段需要不止一个字节

这就是说,如果您正试图将多个
设施
与多个
用户
连接起来,那么这样的事情也许是正确的

CREATE TABLE `facilities_users` (
  `facility_id` BIGINT() UNSIGNED NOT NULL COMMENT 'foreign key -> facilities.id',
  `user_id` BIGINT() UNSIGNED NOT NULL COMMENT 'foreign key -> users.id',
)

通过上表,您可以加入并获得用户想要的设施列表。您甚至不需要存储布尔值,因为此表中存在一行,并且设备id将其链接到用户,这意味着他们选择了它。

如果您的数据库支持它,我建议使用
布尔数据类型

如果这是MySQL:

布尔

这些类型是TINYINT(1)的同义词。零的值被认为是错误的。非零值被认为是真的:


--

如果您的数据库支持它,我建议使用
布尔数据类型

如果这是MySQL:

布尔

这些类型是TINYINT(1)的同义词。零的值被认为是错误的。非零值被认为是真的:



--

对于少量的大容量,可能没问题。@Jan我觉得你的评论难以理解。“[…]少量大量。”大量什么?确切地说:)OP在这方面不是很清楚。。。因此,我的尖刻评论:)对于少量的大容量产品可能没问题。@Jan我发现你的评论难以理解。“[…]少量大量。”大量什么?确切地说:)OP在这方面不是很清楚。。。因此我尖刻地评论道:)那么你建议第三张桌子作为参考?我想这是一种有设施的房地产。此外,如果有(比如)10个设施,则可以将它们存储为单独的字段。如何在crud系统中使用此表?@chchrist-像您应该使用的那样使用数据库,并创建一个设施表,用于存储名称。如果你只存储ID,你将很难跟踪它们。关于积垢系统,它和其他任何表一样。您将使用用户id和设施id进行一次插入(不要忘记autoincrement列),因此您建议使用第三个表作为参考?我想这是一种拥有设施的房地产。此外,如果有(比如)10个设施,则可以将它们存储为单独的字段。如何在crud系统中使用此表?@chchrist-像您应该使用的那样使用数据库,并创建一个设施表,用于存储名称。如果你只存储ID,你将很难跟踪它们。关于积垢系统,它和其他任何表一样。您将使用用户id和设备id进行一次插入(不要忘记autoincrement列)。我不明白如何在crud应用程序中使用此表结构。特别是更新/删除操作。如果用户更新60个设施(选中/取消选中),该怎么办。我必须向数据库进行60次查询?您可以进行多次插入,而不是60次查询<代码>插入tbl_名称(a、b、c)值(1,2,3)、(4,5,6)、(7,8,9)如果他们“取消选中”你可以做的事情:
从设施用户中删除,其中设施id在(2,5,6,…)中,用户id=7请参阅。如果在我执行插入时数据库中已经存在设备id/用户id组合,该怎么办?您可以在该组合上放置主键,并防止重复的行。插入时会出错。不过,我无法说明这将如何影响多个insert语句。我无法理解如何在crud应用程序中使用此表结构。特别是更新/删除操作。如果用户更新60个设施(选中/取消选中),该怎么办。我必须向数据库进行60次查询?您可以进行多次插入,而不是60次查询<代码>插入tbl_名称(a、b、c)值(1,2,3)、(4,5,6)、(7,8,9)如果他们“取消选中”你可以做的事情:
从设施用户中删除,其中设施id在(2,5,6,…)中,用户id=7请参阅。如果在我执行插入时数据库中已经存在设备id/用户id组合,该怎么办?您可以在该组合上放置主键,并防止重复的行。插入时会出错。不过,我不能谈论这将如何影响多个insert语句。