【问题标题】:Which datatype to choose and how to implement it on the script (Many-to-Many relationship)选择哪种数据类型以及如何在脚本上实现它(多对多关系)
【发布时间】:2011-03-25 18:35:54
【问题描述】:

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

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

我想知道这是否是最好的方法......

提前致谢。

【问题讨论】:

  • 少量大件也可以。
  • @Jan 我觉得你的评论难以理解。 “[...] 少量大量。”大什么?
  • 完全正确 :) OP 在这方面并不是很清楚......因此我的尖刻评论:)

标签: php database database-design


【解决方案1】:

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

`MyBooleanColumn` TINYINT(1) UNSIGNED DEFAULT 0

我不知道这是否对性能有任何好处,但它可以让你做超过 2 个值,它可能高达 255,因为 TINYINT 是一个字节。但我想一个 ENUM 字段需要超过一个字节。

也就是说,如果您尝试将多个 facilities 与多个 users 链接起来,那么也许这样的事情是合适的?

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,这意味着他们选择了它。

【讨论】:

  • 我不明白如何在 crud 应用程序中使用这个表结构。特别是关于更新/删除操作。如果我的用户更新了 60 个设施(选中/取消选中)怎么办。我必须对数据库进行 60 次查询?
  • 您可以进行多次插入而不是 60 次查询。 INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9); 如果他们“取消选中”您可以执行的操作:DELETE FROM facilities_users WHERE facility_id IN (2,5,6,...) AND user_id = 7; 请参阅 this resource for a way to do that with PHP arrays
  • 当我执行 INSERT 时,如果 db 中已经存在 facility_id/user_id 组合怎么办?
  • 您可以在该组合上放置一个主键并防止重复行。它只会在插入时出错。不过,我无法谈论这将如何影响多重插入语句。
【解决方案2】:

如果您的数据库支持,我建议使用BOOLEAN 数据类型。

如果这是 MySQL:

布尔值,布尔值

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

-- Numeric Types Overview

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 所以你推荐第三张表作为参考?
    • 我想这是某种拥有设施的房地产。此外,如果有 10 个设施,则可以将它们存储为单独的字段。
    • 如何在 crud 系统中使用此表?
    • @chchrist - 像你应该的那样使用数据库并创建一个设施表,你将在其中存储名称。如果您只存储 ID,您将很难跟踪它们。关于 crud 系统,它就像任何其他表一样。您将使用用户 ID 和设施 ID 进行插入(不要忘记自动增量列)
    猜你喜欢
    • 1970-01-01
    • 2014-05-16
    • 1970-01-01
    • 2014-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-01
    • 1970-01-01
    相关资源
    最近更新 更多