Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 数据库规范化:使用单独的表存储单个字段_Mysql_Database_Normalization - Fatal编程技术网

Mysql 数据库规范化:使用单独的表存储单个字段

Mysql 数据库规范化:使用单独的表存储单个字段,mysql,database,normalization,Mysql,Database,Normalization,目前,我们的数据库是这样设置的,即付款交易记录付款类型ID,并链接到包含这些值的付款类型(现金、支票、信用)表。例如: 支付交易: 身份证 数量 日期 付款类型ID 支付类型: 身份证 付款类型(现金、信用卡) 我的问题是我是否应该删除payment type表,并将payment type值作为文本存储在payment事务中 这类似于。除了支付类型之外,可以肯定的是,不需要为每种支付类型添加数据“现金”与任何东西都没有关联,我不需要知道现金本身的任何东西,它只是 据我所知,用单个字段替

目前,我们的数据库是这样设置的,即付款交易记录付款类型ID,并链接到包含这些值的付款类型(现金、支票、信用)表。例如:

支付交易:

  • 身份证
  • 数量
  • 日期
  • 付款类型ID
支付类型:

  • 身份证
  • 付款类型(现金、信用卡)
我的问题是我是否应该删除payment type表,并将payment type值作为文本存储在payment事务中

这类似于。除了支付类型之外,可以肯定的是,不需要为每种支付类型添加数据“现金”与任何东西都没有关联,我不需要知道现金本身的任何东西,它只是

据我所知,用单个字段替换付款类型表的利弊如下:

专业人士

  • 每当需要找到付款类型时,删除几乎不必要的联接
  • 交易的付款类型将始终准确反映交易记录时的付款类型。i、 e.如果我将“付款类型”表中的“现金”记录更改为“信用”(无论出于何种原因),所有链接到现金的付款交易现在都将链接到信用
缺点

  • 将付款类型存储为文本字段将降低按付款类型排序的速度,并使这种排序比现在更混乱
  • 交易的付款类型将始终准确反映交易记录时的付款类型。i、 e.如果我有一个输入错误,并且付款类型被存储为“Kash”,我可以很容易地修复该输入错误,并且链接到该付款类型的所有交易都将自动更新

我倾向于删除“付款类型”表,并将单个字段添加到“付款交易”表中,您建议最好的做法是什么?

我不同意您的两个主张

每当支付类型需要时,删除几乎不必要的联接 找到了

您只是假设这将是一个性能瓶颈。反规范化是当你有数据表明你必须这样做时你应该做的事情。这可不是那种时候

交易的付款类型将始终准确地反映 这是在交易被记录的时候。i、 e.如果我更改了 付款类型表中的“现金”记录为“贷记”(无论什么 原因),所有链接到现金的支付交易现在都将被链接 归功于

您不应允许他人以这种方式修改付款类型。更改付款类型应该是另一个具有自己时间戳的交易

任何关系数据库都可以处理连接和规范化表。恐怕你犯了过早优化的错误


我会花更少的时间担心这件事,更多的时间思考你将如何处理历史。在将事务移出历史记录表之前,您将保留事务多长时间?您是否考虑过根据时间戳按月份对数据库进行分区?那更值得你努力。

我不同意你的两个主张

每当支付类型需要时,删除几乎不必要的联接 找到了

您只是假设这将是一个性能瓶颈。反规范化是当你有数据表明你必须这样做时你应该做的事情。这可不是那种时候

交易的付款类型将始终准确地反映 这是在交易被记录的时候。i、 e.如果我更改了 付款类型表中的“现金”记录为“贷记”(无论什么 原因),所有链接到现金的支付交易现在都将被链接 归功于

您不应允许他人以这种方式修改付款类型。更改付款类型应该是另一个具有自己时间戳的交易

任何关系数据库都可以处理连接和规范化表。恐怕你犯了过早优化的错误


我会花更少的时间担心这件事,更多的时间思考你将如何处理历史。在将事务移出历史记录表之前,您将保留事务多长时间?您是否考虑过根据时间戳按月份对数据库进行分区?这将更值得您努力。

如果删除PaymentType表,您将用表检查约束替换外键检查:

PaymentType   CHAR(6) NOT NULL CHECK(PaymentType IN('Cash', 'Credit', 'Cheque')
好的-你把“支票”写成“支票”;这只是英语和美国的另一个区别

现在,这使得找出可能的值变得更加困难;您必须分析系统目录才能找到答案。使用单独的表,您可以检查单独的表以找出允许的内容。假设您开始分别跟踪“借方”和“贷方”;将行添加到表中,而不是更改表架构。假设您决定需要记录未来交易中允许使用的代码(因此“现金”不再是选项)。您可以向“付款类型”表中添加一列,以指示此代码不再有效;使用简单的检查约束要困难得多

因此,即使您当前在Payment Type表中有有限的或没有额外的数据,我还是会使用Payment Type表,而不是将Payment Type嵌入Payment Transaction表中

如果是我的设计,我可能会使用CHAR(1)或CHAR(2)代码作为支付类型的标识符,而不是数字列。诚然,这三种类型都以“C”开头,所以你可能会用“A”表示现金,“H”表示支票,“R”表示贷项(也可能用“d”或“E”表示借方或借方),并带有字符(1)代码;使用CHAR(2),您将