gpt4 book ai didi

php - 何时在数据库列中使用逗号分隔值?

转载 作者:行者123 更新时间:2023-12-01 00:06:49 25 4
gpt4 key购买 nike

好的,我知道技术答案是 NEVER .

但是,有时候它似乎可以用更少的代码让事情变得简单得多,而且似乎没有什么缺点,所以请听我说。

我需要构建一个名为 Restrictions 的表来跟踪人们希望联系的用户类型,该表将包含以下 3 列(为简单起见):

minAge
lookingFor
drugs

lookingFordrugs 可以包含多个值。

数据库理论告诉我,我应该使用连接表来跟踪用户可能为其中任一列选择的多个值。

但似乎使用逗号分隔值会使事情更容易实现和执行。这是一个例子:

假设用户 1 具有以下限制:

minAge => 18
lookingFor => 'Hang Out','Friendship'
drugs => 'Marijuana','Acid'

现在假设用户 2 想要联系用户 1。好吧,首先我们需要看看他是否符合 User 1 的限制,但即使使用逗号分隔的列也很容易,例如:

首先我会得到目标(用户 1)的限制:

SELECT * FROM Restrictions WHERE UserID = 1

现在我只是将它们放入各自的变量原样到 PHP 中:

$targetMinAge = $row['minAge'];
$targetLookingFor = $row['lookingFor'];
$targetDrugs = $row['drugs'];

现在我们只检查 SENDER(User 2)是否符合这个简单的条件:

COUNT (*) 
FROM Users
WHERE
Users.UserID = 2 AND
Users.minAge >= $targetMinAge AND
Users.lookingFor IN ($targetLookingFor) AND
Users.drugs IN ($targetDrugs)

最后,如果 COUNT == 1,用户 2 可以联系用户 1,否则他们不能。

THAT有多简单?这看起来真的很简单和直接,那么只要我在每次用户更新他们的联系限制时清理数据库的所有输入,这样做的真正问题是什么?能够使用 MySQL 的 IN 函数并且已经以它可以理解的格式存储多个值(例如,逗号分隔值)似乎比必须为每个多个创建连接表更容易 -选择栏。而且我举了一个简化的例子,但是如果有10个多选列呢?然后,由于连接表太多,事情开始变得困惑,而 CSV 方法保持简单。

那么,在这种情况下,如果我使用逗号分隔值真的那么糟糕吗?

****鸭子****

最佳答案

你已经知道答案了。

首先,您的 PHP 代码甚至无法正常工作,因为它仅在用户 2 在 LookingFor 或 Drugs 中只有一个值时才有效。如果其中任一列包含多个逗号分隔值,则 IN 将不起作用,即使这些值与用户 1 的值的顺序完全相同。如果 右侧 有一个或多个逗号,IN 会做什么?

因此,在 PHP 中做您想做的事并不“容易”。这实际上非常痛苦,涉及将用户 2 的字段拆分为单个值,编写具有许多 OR 的动态 SQL 来进行比较,然后执行效率极低的查询来获取结果。

此外,您甚至需要编写 PHP 代码 来回答关于两个集合的交集这样一个相对简单的问题,这意味着您的设计存在严重缺陷。这正是 SQL 旨在解决的问题(关系代数)。正确的设计可以让您在数据库中解决问题,然后简单地用 PHP 或其他一些技术在上面实现一个表示层。

正确地做,你会过得更轻松。

关于php - 何时在数据库列中使用逗号分隔值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7518566/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com