Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.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_Sql_Oracle_Database Design_Nosql - Fatal编程技术网

Mysql 单列与多列设计(针对非主键列)

Mysql 单列与多列设计(针对非主键列),mysql,sql,oracle,database-design,nosql,Mysql,Sql,Oracle,Database Design,Nosql,在数据库表设计中,对于事件日志类型的数据增长,以下哪项设计更好 设计1)数字列(长)和字符列(Varchar2),并使用 索引: 设计2)带索引的字符列Varchar2: 设计优势:第一种设计非常具体,第二种设计更通用,可以容纳更多的通用数据。在这两种情况下,列都被索引 存储:第一个设计索引需要的存储少于第二个 表演:一样吗 我有一个关于性能和灵活性的问题。显然,第一种设计更好。但第二种设计更具通用性。让我知道你的见解 注意:为了更清楚,编辑了问题 在关系数据库设计中,需要离散列。每列每行一个值

在数据库表设计中,对于事件日志类型的数据增长,以下哪项设计更好

设计1)数字列(长)和字符列(Varchar2),并使用 索引:

设计2)带索引的字符列Varchar2:

设计优势:第一种设计非常具体,第二种设计更通用,可以容纳更多的通用数据。在这两种情况下,列都被索引

存储:第一个设计索引需要的存储少于第二个 表演:一样吗

我有一个关于性能和灵活性的问题。显然,第一种设计更好。但第二种设计更具通用性。让我知道你的见解


注意:为了更清楚,编辑了问题

在关系数据库设计中,需要离散列。每列每行一个值

这是使用数据类型和约束实现某些数据完整性的唯一方法。在第二个设计中,您将如何在StockNumber或StockDomain上实现唯一约束?您如何确保StockNumber实际上是一个数字

这是单独在每列上创建索引或创建将StockDomain放在第一位的复合索引的唯一方法

打个比方,看看电话簿:你能轻易或有效地找到所有名字叫“比尔”的人吗?不,你必须搜索整本书才能找到有特定名字的人。索引中列的顺序很重要

第二种设计实际上根本不是一个数据库——它是一个文件


为了回应你的评论,我重申我在评论中所写的内容:


有时反规范化是值得的,但我无法判断[您的第二个设计是否值得],因为您没有描述如何查询这些数据。在决定任何优化之前,您必须考虑您的查询需求

另一种说法是:反规范化和所有其他优化一样,有利于一种查询类型,而牺牲了其他查询类型。因此,您需要知道哪些查询需要优化,哪些查询不那么重要,这样在其他查询降级时不会影响您的整体性能

如果无法预测查询,则默认为使用规范化规则设计数据库。规范化不是为性能优化而设计的,它是为防止数据异常而设计的,这也是一个很好的目标



你发表了一些新的评论,我想是希望我能突然理解并认可你的第二个设计。但您仍然没有描述任何将使用第二种设计进行优化的特定查询。

在关系数据库设计中,您需要离散列。每列每行一个值

这是使用数据类型和约束实现某些数据完整性的唯一方法。在第二个设计中,您将如何在StockNumber或StockDomain上实现唯一约束?您如何确保StockNumber实际上是一个数字

这是单独在每列上创建索引或创建将StockDomain放在第一位的复合索引的唯一方法

打个比方,看看电话簿:你能轻易或有效地找到所有名字叫“比尔”的人吗?不,你必须搜索整本书才能找到有特定名字的人。索引中列的顺序很重要

第二种设计实际上根本不是一个数据库——它是一个文件


为了回应你的评论,我重申我在评论中所写的内容:


有时反规范化是值得的,但我无法判断[您的第二个设计是否值得],因为您没有描述如何查询这些数据。在决定任何优化之前,您必须考虑您的查询需求

另一种说法是:反规范化和所有其他优化一样,有利于一种查询类型,而牺牲了其他查询类型。因此,您需要知道哪些查询需要优化,哪些查询不那么重要,这样在其他查询降级时不会影响您的整体性能

如果无法预测查询,则默认为使用规范化规则设计数据库。规范化不是为性能优化而设计的,它是为防止数据异常而设计的,这也是一个很好的目标



你发表了一些新的评论,我想是希望我能突然理解并认可你的第二个设计。但是您仍然没有描述任何将通过使用第二种设计进行优化的特定查询。

一般来说,使用离散列是更好的方法,原因如下:

  • 数据类型-您可以保证保存的数据格式正确,至少对于非字符串列而言,如果stockNumber是bigint/long,则它将始终是一个数字,尝试将其设置为任何其他值都会导致插入/更新出错。作为冒号分隔值(CSV)字符串的一部分,如果它是字符串的一部分,则有可能出现错误数据

  • 查询-查询单个列必须使用
    一样完成,因为您要查找单个列字符串的子字符串。如果我查找
    WHERE StockDetails,比如“%11111%”
    我会找到第一行,但我可能会找到另一行,在该列中的另一个字段中,美元值是$11111。对于离散列,您的查询将是
    ,其中StockNumber=11111
    保证只在该列中找到数据

  • 使用数据-一旦找到所需的行,就必须读取数据。这意味着将CSV解析为单独的字段。如果其中一个字段中有冒号,并且转义不正确,则其余数据将被错误解析,并且您仍然需要保证相同顺序的值,留下空白部分
    哪里
    
    ..(pkey)|..|..|StockNumber Long | StockDomain Varchar2 |...
    ..      |..|..|11111            | Finance
    ..      |..|..|23458            | Medical
    
    ..(pkey)|..|..|StockDetails  Varchar2(1000) |..|..
    ..      |..|..|11111;Finance                |..|.. 
    ..      |..|..|23458;Medical                |..|..
    
    +--------------------------------------+
    |             StockDetails             |
    +--------------------------------------+
    | {"number":11111, "domain":"Finance"} |
    | {"number":23458, "domain":"Medical"} |
    +--------------------------------------+