5

好的,我最近问了一个问题,用户回答是我应该规范化我的数据库,但我认为我不应该真的这样做..

逻辑是这样的

我将脚本存储在数据库中,这些脚本根据用户动态执行。

例如,有一个脚本表

script_id | script_name
+----------------------+
12345       demo1
54462       demo2
90874       demo3
43058       demo4

现在是用户表

allowed_script_ids
+-----------------+
21345|90874

所以这在这里很简单,但是如果我删除 say 会发生什么script_id 90874,但它不会从用户表中删除记录,所以他们建议我规范化数据库,但是如果用户可以访问 1000 个脚本怎么办?我需要1000条记录吗?还是我应该继续我的方式?即使我为每个访问插入每个记录条目,我也需要在每次撤销该用户的访问时删除这些条目。

4

3 回答 3

6

1000 行并不多(同样,10,000,000 行也不算多),规范化您的数据库(即,将用户与脚本相关联)非常适合这一点。如果您要连接一个字符串,除非您正在使用TEXT(无论如何这都是 baaaaad!),否则您可能会遇到某种形式的字段长度限制,然后才能添加太多脚本 ID。

所以是的,我还建议你在这个程度上标准化:

Script

script_id
name

User

user_id
...

User_Script

user_script_id
user_id
script_id

可视化

..然后每个关系都会进入User_Script

这比连接字符串要干净得多,并且在删除时从字符串中查找/替换。它将更快、更清晰,并帮助您以更精简的方式实际查看数据库。

目前,您将如何从数据库中获取所有脚本名称?使用上述稍微标准化的设计,您可以运行类似于以下的查询:

SELECT `user`.`first_name`, `script.name` FROM `User_Script`
INNER JOIN `Script` USING (`script_id`)
INNER JOIN `User` USING (`user_id`)
于 2013-01-15T12:29:24.637 回答
2

我会将这些数据标准化,是的。将用户与脚本联系起来的第三个表是您应该做的。

如果用户可以访问 1000 个脚本,那肯定意味着这个新的第三个表中有 1000 个条目,但这没关系。您会发现数据更易于管理,如果像您说的那样删除了一个脚本,那么在第三个表中删除它的条目也很简单,而不必在分隔字段中使用尴尬的子字符串例程用户表。

不用担心这会在新表中产生多少行,MySQL 完全有能力轻松处理表中的数百万行,如果您创建了不错的索引,它将允许您非常快速地连接这 3 个表,可能比您现在必须执行的执行子字符串匹配更快。

于 2013-01-15T12:30:13.257 回答
0

您可以使用状态位来指示使用的访问权限。通过这种方式,您可以获得使用唯一脚本 id 索引快速访问的优势,并且对于更新所有它需要重置您的布尔位

例如

    user access
    script_id user_id isGranted
    ----------------------------
    21345     some_user_id yes

而且,如果您必须根据用户的偏好不断地授予或获取对脚本的访问权限,那么您最初使用字符串并筛选用户可以访问的脚本的想法可能效率低下

考虑这个

    12|34|45|56|

如果您必须重复授予或撤销对脚本 56 的访问权限怎么办?. . .您无法为这种不必要且效率低下的重复操作检索和处理字符串。在这种情况下,设置一个布尔位有助于并节省大量的处理麻烦

于 2013-01-15T12:33:48.000 回答