数据库规范化和数据输入(管理后端)


Database Normalisation and Data Entry (admin backend)

看一下下面的items表,可以看到这个表没有规范化。Name应该放在一个单独的表中,以使其规范化。

mysql> select * from items;
+---------+--------+-----------+------+
| item_id | cat_id | name      | cost |
+---------+--------+-----------+------+
|       1 |    102 | Mushroom  | 5.00 |
|       2 |      2 | Mushroom  | 5.40 |
|       3 |    173 | Pepperoni | 4.00 |
|       4 |    109 | Chips     | 1.00 |
|       5 |     35 | Chips     | 1.00 |
+---------+--------+-----------+------+

该表没有规范化,因为在后端Admin站点上,工作人员只需选择一个类别并在项目名称中键入即可快速添加数据。它非常快。有数百种商品名称相同,但成本并不总是相同的。

如果我将这个表规范化成这样:

mysql> select * from items;
+---------+--------+--------------+------+
| item_id | cat_id | item_name_id | cost |
+---------+--------+--------------+------+
|       1 |    102 |            1 | 5.00 |
|       2 |      2 |            1 | 5.40 |
|       3 |    173 |            2 | 4.00 |
|       4 |    109 |            3 | 1.00 |
|       5 |     35 |            3 | 1.00 |
+---------+--------+--------------+------+
mysql> select * from item_name;
+--------------+-----------+
| item_name_id | name      |
+--------------+-----------+
|            1 | Mushroom  |
|            2 | Pepperoni |
|            3 | Chips     |
+--------------+-----------+

现在我如何在管理后端(数据入口的角度)添加项(数据),因为这个表已经规范化了?我不希望像下拉菜单那样选择商品名称——会有成千上万个不同的商品名称——查找商品名称然后输入价格会花费很多时间。

需要有一种方法来添加项目/数据尽可能快。这个的解是什么?我用PHP开发了后端。

编辑项目名称的解决方案是什么?工作人员可能会将商品名称完全重命名,例如:Fish Kebab改为Chicken Kebab,这将在不知不觉中影响所有类别。会有一些拼写错误,可能需要纠正像F1sh Kebab应该是Fish Kebab(这是有用的,当表规范化,我会看到项目名称更新每个类别)。

我不希望像下拉菜单那样选择物品名称——会有成千上万个不同的物品名称——查找物品名称然后输入成本会花费很多时间。

有选择现有项目的选项,而不是下拉框。您可以使用自动完成,并且只接受已知值。我只是想说清楚,有一些UI友好的方法可以实现你的目标。

至于做还是不做,那取决于你。如果产品名称稍有不同,会有问题吗?像这样的小数据完整性问题可以通过批处理作业或类似的方法来纠正吗?

根据您的系统设计,首先决定您的数据应该是什么样子。在做出决定后,再考虑构建UI的最佳方式。就像我说的,不管你的数据结构如何,都有可用的UI设计方法。

我认为你现在的设计很好,因为你的名字是产品名称而不是类别名称,你可能想避免重命名单个产品会同时重命名多个产品的情况。

规范化是一件好事,但您必须根据您的特定需求来衡量它,在这种情况下,我真的不会像上面所示的那样添加额外的表item_name。

只是我的两分钱:)

你的表应该代表什么依赖关系?钥匙是什么?根据你所说的,我看不出你的第二个设计比第一个更规范。

假设第一个设计中的"name"的决定因素与第二个设计中的"item_name_id"的决定因素相同?如果是这样,那么将name移到另一个表中不会对items表所满足的正常形式产生任何影响。

用户界面设计与数据库设计无关。您不能让UI驱动数据库设计并期望得到合理的结果。

您需要验证数据并在添加它之前检查它是否存在,以查看它是否是一个新值。

$value = $_POST['userSubmittedValue']
//make sure you sanitize the variable (never trust user input)
$query = SELECT item_name_id 
         FROM item_name 
         WHERE name='$value';
$result = mysql_query($query);
$row = mysql_fetch_row($result);
if(!empty($row))
{
//add the record with the id from $row['item_name_id'] to items table
}
else
{
//this will be a new value so run queries to add the new value to both items and item_name tables
}

需要有一种方法来添加项目/数据尽可能快。是什么?如何解决这个问题?我用PHP开发了后端。

用户界面问题和数据库结构是分开的问题。对于给定的数据库结构,通常有几种用户友好的方式来表示和更改数据。数据完整性来自于数据库。用户界面只需要知道在哪里可以找到唯一的值。程序员决定如何使用这些惟一的值。您可以使用下拉列表、弹出搜索表单、使用自动完成、将用户类型与数组中的元素进行比较,或者查询数据库以查看该值是否已经存在。

从你的描述中,听起来你有一种非常快速的方法来添加数据:"员工只需选择一个类别并键入项目名称即可快速添加数据"。(将"mushroom"替换为"1"与标准化没有任何关系。)

编辑项目名称的解决方案是什么?员工可能会将项目名称完全重命名,例如:Fish Kebab to Chicken这将在不知不觉中影响所有类别。

您允许错误的人编辑项目名称。认真。

这种问题在每个数据库应用程序中都会出现。只允许训练有素且值得信赖的人来做这些改变。(请参阅dbms文档中的GRANT和REVOKE。还要看一下ON UPDATE RESTRICT

在工作中的生产数据库中,我可以插入新的州(对于美国),并且可以将现有的州名更改为我想要的任何名称。但如果我把"阿拉巴马"改成"吉尔吉斯斯坦"我会被解雇的。因为我应该知道不该做这种事。

但是,即使我是管理员,我也不能编辑旧金山的地址并将其邮政编码更改为"71601"。数据库"知道"'71601'不是旧金山的有效邮政编码。也许您也可以在数据库中添加一两个表。从你的描述中我不知道这样的东西是否对你有帮助。

在我不是管理员的系统上,我希望没有权限将行插入状态表。在其他表中,我可能有插入行的权限,但没有更新或删除它们的权限。

会有一些拼写错误,可能需要纠正,如F1sh烤肉串应该是鱼烤肉串

教训是一样的。有些人应该被允许更新item .name,而有些人不应该。撤销权限,限制级联更新,使用更多的表来提高数据完整性,或者增加训练。