标签: database-agnostic

使用Liquibase创建具有降序键列的索引

我想知道是否有一种通用的方法来创建liquibase的"有序索引".会产生这些SQL语句的东西:

CREATE INDEX idx_name ON my_table (m_column DESC)
Run Code Online (Sandbox Code Playgroud)

我需要oracle,postgresql,mysql和sql server.

如果没有,我将不得不手动使用SQL每个RDBM 的标签.

indexing rdbms database-agnostic liquibase

12
推荐指数
2
解决办法
4845
查看次数

选择每个的最大值(Col1,Col2)

让我们假设下表:

Name             SubName        Message    Time
USA             MA              M1         1
USA             NY              M2         2
USA             WA              M3         3
USA             MA              M4         4
USA             WA              M5         5
USA             NY              M6         6
FIN             HEL             M7         7
FIN             TAM             M8         8
FIN             HEL             M9         9
Run Code Online (Sandbox Code Playgroud)

我想要一个SQL查询,它将返回以下内容:

Name             SubName        Message    Time
FIN              HEL            M9         9
FIN              TAM            M8         8
USA              NY             M6         6
USA              WA             M5         5
USA              MA             M4         4
Run Code Online (Sandbox Code Playgroud)

所以a ORDER BY time DESC,按不同的名称分组,并按不同的子名称分组.

这可能吗?我正在寻找一种不是DBMS特定的解决方案 - 可以在大多数DBMS中运行.

sql database-agnostic

12
推荐指数
2
解决办法
624
查看次数

如何通过用户输入破坏/利用此SQL查询代码?

可能重复:
我可以通过使用单引号转义单引号和周围用户输入来防止SQL注入吗?

我们有一个遗留应用程序不使用位置参数进行查询,并且到处都有SQL.决定(在我开始之前)由于用户输入可以包含撇号,因此应该为这些撇号手动转义每个字符串输入.

这是必要的原始代码(不是由我编写的),翻译成C#以便于使用:

private string _Escape(string input)
{
    return input.Replace("'", "''");
}

private bool _IsValidLogin(string userName, string password)
{
    string sql =
        string.Format
        (
            @"SELECT COUNT(*) FROM UserAccounts
                WHERE UserName = '{0}' AND Password = '{1}'",
            _Escape(userName),
            _Escape(password)
        );
    // ...
}
Run Code Online (Sandbox Code Playgroud)

这看起来似乎可以在某种程度上被打破,但我不知道它是如何被用户输入利用的.假设用户输入未经过滤直到它命中_IsValidLogin,并忘记密码似乎以纯文本形式存储.

支持它的解决方案是显而易见的 - 使用位置参数 - 但是我需要一些弹药来向管理人员证明这个代码为什么/如何不安全所以可以分配时间/ $来修复它.

注意:我假设这可能会被打破,但实际情况可能并非如此.我不是SQL巨星.

注2:我已将此问题表达为与数据库无关,但如果您可以将此代码用于某个引擎,我欢迎您的贡献.

sql database sql-injection database-agnostic

8
推荐指数
1
解决办法
614
查看次数

用于CURRENT_TIMESTAMP的数据库不可知SQL

我目前正在使用Oracle,但大多数SQL都是db不可知的.一个例外是CURRENT_TIMESTAMP在MSSQL中失败.是否有可能为此移动到更便携的语法?

sql database-agnostic

8
推荐指数
1
解决办法
1478
查看次数

您如何编写应用程序以独立于数据库?

我的老板要求我只编写ANSI SQL以使其与数据库无关.但我了解到并不是那么容易,因为没有数据库完全兼容ANSI SQL.SQL代码很少在没有修改的情况下在数据库系统之间移植.

我看到人们以不同的方式使他们的程序数据库独立.例如:

  1. 将SQL语句外部化为资源文件.
  2. 编写许多提供者类来支持不同的数据库.
  3. 只写简单的SQL,并远离高级函数/连接.

你总是把你的代码写成"任何数据库就绪"吗?或者只在需要时才这样做?如果是的话,你是如何实现的?

database database-agnostic ansi-sql

7
推荐指数
2
解决办法
3790
查看次数

ID列的推荐数据类型是什么?

我意识到这个问题之前很可能已被问过,但我在StackOverflow上搜索了一些问题,我没有真正找到答案,所以这里有.如果您发现重复,请链接到它.

出于某种原因,我更喜欢在我的主键字段中使用Guids(uniqueidentifier在MsSql中),但我真的不知道为什么这会更好.在许多教程中,我最近走了一段时间,int使用了自动递增.我可以看到两者的专业和缺点:

  • A Guid总是具有相同的大小和长度,并且没有理由担心耗尽它们,而在你用完一个数字之前,你可以拥有多少记录int.
  • int (至少在C#中)是一个可空类型,在查询数据时会打开几个快捷方式.
  • 而且int更容易阅读.
  • 我打赌你可以在这里提出至少几件事.

因此,就像标题所说的那样简单:数据库中ID(主键)列的推荐数据类型是什么?

编辑:收到几个简短的答案后,我还必须添加这个后续问题.没有它,你的答案既不引人注目也不教育...;)为什么你这么认为,另一种选择的缺点是什么让你选择呢?

language-agnostic database-design types primary-key database-agnostic

7
推荐指数
3
解决办法
1万
查看次数

在RDBMS中实现灵活的关系 - 真正的权衡是什么?

我有一堆产品,每种产品都有许多不同的可能属性.例如,产品A具有名称,大小,颜色,形状.产品B有名称,卡路里,糖等.解决这个问题的一种方法是:

1)创建表

Products (id, name)
Attributes (id, name)
Product_Attributes (product_id, attribute_id, value as string)
Run Code Online (Sandbox Code Playgroud)

这允许最大的灵活性,但我听到很多人建议反对这个,虽然我不知道为什么.我的意思是,如果这些表被称为团队,玩家,Team_Players,我们都同意这是适当的关系设计.

每个向我解释为什么这么糟糕的人都会在一个完全灵活的关系设计的环境中这样做,你不会创建真正的表通过基本的几个基本初始表(例如object,attribute,object_attribute) - 我认为我们所有人都同意是坏事.但这是一个更加有限和包含的版本(只有产品,而不是系统中的每个对象),所以我认为将这两种架构组合在一起并不公平.

您遇到的哪些问题(经验或理论上的问题)使这个设计如此糟糕?

2)解决这个问题的另一种方法是创建一个Product表,其中包含一些列,如Size,Color,Shape,Weight,Sugar等,然后在末尾包含一些额外的列,以便为我们提供一些灵活性.这将创建通常稀疏的行,主要填充NULL.人们倾向于喜欢这种方法,但我的问题是,在此方法失去性能优势之前,您可以拥有多少列?如果你有200列,我想这不再是一个聪明的举动,但100列呢?50列?25列?

3)我所知道的最后一种方法是将所有属性作为blob(可能是JSON)存储在Products表的单个列中.我喜欢这种方法,但感觉不对.查询很难.如果您希望以后能够轻松更改属性的名称,则必须单独解析每个记录,或者通过某个ID将它们键入blob中.如果你去id路径然后你将需要另一个表属性,事情开始看起来像上面的方法#1,除了你将无法将你的blob加入attribute_id,所以我希望你不想查询任何东西按属性名称.

我喜欢这种方法的是你可以查询一个产品,在你的代码中你可以快速地访问它拥有的所有属性.如果删除产品,则无需清理其他表 - 易于保持一致.

4)我已经阅读了一些关于能够在某些RDBMS中索引强类型xml格式的东西,但老实说我对这种方法知之甚少.

我被卡住了.我认为方法#1是最好的选择,但我读到的所有内容都说这样的方式很糟糕.考虑这个问题的正确方法是什么,以便能够确定给定情况的最佳方法是什么?明显欢迎比我列出的更多的想法!

sql relational-database database-agnostic entity-attribute-value

7
推荐指数
1
解决办法
378
查看次数

NOW()是一个稳定的功能吗?

如果我做

INSERT INTO table1 (datetime1, datetime2) VALUES (NOW(),NOW())
Run Code Online (Sandbox Code Playgroud)

两列中的两个字段是否始终相同?

同上

INSERT INTO table1 (datetime1, datetime2) VALUES (NOW(),NOW())
                                                ,(NOW(),NOW()) 
Run Code Online (Sandbox Code Playgroud)

是否所有四个数据库条目都具有相同的值,或者row1 <> row2可能?

请注意,这是一个理论问题,而不是一个work-around问题.
我真的很想知道如何以及为什么.

sql database-agnostic

7
推荐指数
1
解决办法
568
查看次数

将数据库字符串枚举转换为值得的整数?

有两种方法可以在数据库中存储枚举类型:字符串或整数.

将枚举(sex = {male,female},account_type = {regular,pro,admin}等)保存为字符串会使事物更具可读性,但需要比整数更多的空间.

另一方面,整数需要将枚举映射到数据库中和从数据库中导出.作为一个好处,区分大小写在数据库外部用整数处理.

假设两者都被索引,那么整数转换是否值得呢?整数查找速度快多少?

也许一个具体的例子可以帮助可视化事物.让我们将上述account_type与100,000个用户的数据库结合使用.

字符串枚举

假设8位固定长度CHAR类型

7*100000*8/8 = 700000 bytes
Run Code Online (Sandbox Code Playgroud)

整数枚举

假设8位TINYINT整数

100000*8/8 = 400000 bytes
Run Code Online (Sandbox Code Playgroud)

似乎大小几乎是整数枚举的一半.还需要对索引进行统一.

sql enums database-agnostic

6
推荐指数
1
解决办法
981
查看次数

更改现有Django项目的时区

就像一个白痴,当我第一次构建一个收集日期时间数据的应用程序时,我完全忽略了时区设置.

这不是一个问题,因为我所做的只是"时间 - 风格"比较和排序.现在我需要做完整的报告来显示实际的日期时间,当然,它们都存储在America/Chicago(荒谬的Django默认值).

是的 我有一个中等大小的数据库,这些日期不正确.我想改变settings.TIME_ZONE,'UTC'但这对我现有的数据没有帮助.

什么是最好的(读取:最简单,最快)的方式来转换所有模型数据集成?

(所有数据都来自过去两个月,所以谢天谢地没有DST转换)

这个项目目前在SQLite上,但我在PostgreSQL上有另一个项目有类似的问题,我可能想在DST开始之前做同样的事情......所以理想情况下是一个与数据库无关的答案.

python django timezone database-agnostic pytz

5
推荐指数
1
解决办法
2890
查看次数