是否有人知道供应商中立的XSD来描述关系数据库模式?我们的系统需要获取有关数据库结构的信息:
以独立于供应商的方式将其存储在XML文件中以供以后处理.
在我们做我们通常做的事情之前,我们自己做.我想做一些研究,看看是否存在人们正在标准化的现有XSD,我认为这对于建模工具等并不是一种罕见的要求.我没有在Google上找到任何与数据库供应商无关的信息.如果您了解现有的公共标准,我将非常感谢您的链接.
提前致谢,
特伦斯
xsd entity-relationship relational-database database-agnostic
许多产品开发人员都希望编写一个.NET应用程序,它可以与任何流行的RDBMS无缝协作,如SQL Server,oracle,DB2,MySql.如果我们使用数据应用程序块,它会根据配置动态选择数据库驱动程序(OracleClient,SQLClient或OleDBClient).
但是,所有数据库都有自己的SQL风格.有一些细微的差别阻止了一个SQL代码库被普遍使用 - 函数名称不同,处理日期的方式不同,Identity列处理方式不同等等.
可以使用Data Direct的第三方产品使用预定义的转义序列来编写DB中性代码.
Microsoft是否有解决此问题的工具或产品?
我知道之前已经问过这类问题,但我找不到一个比较我想到的选项.所以我打算在这里发帖,如果有重复,请发帖链接.
这已经结束了一个相当长的帖子,如果你有时间请阅读它,因为问题在最后
编辑2:我已经接受了答案,因为我认为这将是目前最好的解决方案.但是我想我还想回答另外两个问题来回答关于连接数字的问题.它们可以在这里找到:结合两个整数来创建一个唯一的数字和C#中的Concatenate整数.如果我打算尝试对数字进行编码(如下所示,如51122222),我认为这会很有用.虽然在c#中使用像String.Format这样的东西对我的小应用程序来说足够快.
我目前正在尝试找到一种方法来设置使用相同数据库模式的分布式应用程序,并且可以与一个主数据库同步,其他所有数据库也同步.
我目前计划的程序将作为一个相当简单的程序来跟踪信息.第一个版本可能包含两个表:Items和ItemHistory.这是可能字段的示例:
项目
ItemID(PK)?
Name String
Content String
ItemHistory
ItemHistoryID(PK)?
ItemID(FK)?
EventName String
CreatedOn DateTime
我已经列出了字段名称和类型,这个问题是关于PK类型的用途,因此它们缺失.
第一个版本将是一个标准的桌面应用程序,我目前正在计划使用带有WPF前端的C#和用于数据库的SQLite.最后我还想创建一个在我的Android手机上运行的版本.这是分布式部件的用武之地.我并不总是有信号,因此需要应用程序脱机运行并允许再次联机时同步.
以下是我到目前为止关于如何处理ID的想法:
虽然选项1可行,我过去曾使用它,但我想看看其他选项可能避免UUID问题.我希望有一个解决方案,在调试时更容易阅读并且可以排序.
选项2可行,但它确实限制了记录数量.我知道在我的小应用程序中它几乎不会超过那么多,但我想尝试看看是否有一个解决方案不需要这样的限制.选项3通过使用交替数字来避免限制,但我认为您需要知道要使用多少数据库,否则您可能会填写所有数字.在DB1上使用1的开头和1的增量,在DB2上使用2的开头和2的增量将使用每个数字.您可以使用50作为增量,但之后您只有另一个限制,但现在它可以使用它的应用程序数量.我再次知道它的限制在我的情况下不会受到影响,但在一个突然变得非常受欢迎的应用程序中可能是一个问题.
选项4似乎可以为我解决问题,但我不确定它是否会在实践中起作用.我的一个想法是允许在每个应用程序上设置前缀,然后可以使用自动递增值.例如PC1,PC2用于PC上的记录,也可能是PHONE1,PHONE2等来自Android的记录.这可以工作但是在字符串中使用数字会导致1,1,1,100的排序问题显示在彼此旁边,即使用较少的前导零,然后再次返回到有限数量的记录.
我想知道是否可以使用数字作为DB ID和自动增量.例如,PC = 1,PHONE = 2.那么我们的PC有11,12,13等,第11条记录可能有111条,PHONE则有304条记录为2304条.但我不知道如何做到这一点,或者是否可以轻松完成并且不会导致产生值的额外开销.
在工作中他们使用了类似的编号系统,他们使用类似于51122222的东西.5将引用应用程序的实例,然后是2位数年份,最后是自动递增数字.我还没有得到一个明确的答案,如果我们在一年内超过99999条记录会发生什么.我认为他们可能已经认为它不会发生并且很高兴他们已经计算了风险.
最后一个问题,有没有办法为分布式应用程序创建一个主键系统,允许排序而不强制限制(除了数据类型本身的大小,例如最大整数)?
编辑:这是我打算写的应用程序的更多信息.我想创建一些东西,让我可以存储我可能获得的任何类型的信息,系统将包括标记条目的能力,以便我可以搜索主题.到目前为止,我看到的信息类型可能是关于书籍,DVD,网站等的建议.或者也许是我居住地方的当地提示.一个总体思路是停止将这些信息分散在不同格式的多台计算机/笔记本电脑/手机上.
在寻找 Java 库以与数据库无关的方式构建查询时,我遇到了许多库,包括 iciql、querydsl、jooq、joist、hibernate 等。
我想要一些不需要配置文件并且可以使用动态模式的东西。对于我的应用程序,我在运行时了解数据库和模式,因此我不会有任何配置文件或模式的域类。
这似乎是 querydsl 的核心目标之一,但是通过 querydsl 的文档,我看到了很多使用域类构建动态查询的示例,但我没有遇到任何解释如何仅使用我有关于架构的动态信息。
Jooq 提供了这样的功能(参见:http : //www.jooq.org/doc/3.2/manual/getting-started/use-cases/jooq-as-a-standalone-sql-builder/)但有一个限制性许可证,如果我想将我的注意力扩展到 Oracle 或 MS SQL(我可能不喜欢但需要支持)。
有 querydsl 经验的人可以让我知道 querydsl 是否可以实现这样的事情,如果可以,如何实现。
如果有人知道任何其他可以满足我的要求的人,我将不胜感激。
我正在努力将控制台应用程序从 .NET Framework 4.6.2 移植到 .NET Core 2.0。该应用程序需要连接到一个数据库,该数据库的平台在编译时未知。在完整的框架中,这可以通过使用DbProviderFactories.NET Core 2.0 中不再存在的机制轻松实现。
首先,我想我可以简单地DbProviderFactory自己动态加载相应的内容,使用类似于以下的代码:
public static DbProviderFactory GetFactory(string providerInvariantName)
{
Type type = Type.GetType(dbProvider.Type);
if (null != type)
{
FieldInfo field = type.GetField("Instance", BindingFlags.DeclaredOnly | BindingFlags.Static | BindingFlags.Public);
if (null != field && field.FieldType.IsSubclassOf(typeof(DbProviderFactory)))
{
object value = field.GetValue(null);
if (value != null)
{
return (DbProviderFactory)value;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
正如在这个图书馆中所做的那样。只要DbProviderFactory在编译时引用包含 的程序集,此代码就可以正常工作(这违背了动态加载的目的)。
我试图直接放入System.Data.SqlClient.dll应用程序的文件夹中,但是该Instance字段是null因为这似乎只是不同runtimes程序集的存根实现。当静态引用时,编译器会生成一个.deps.json指向这些文件的详细文件。这里只是为了给人留下印象而做的一个小改动:
... …Run Code Online (Sandbox Code Playgroud) 如果有的话,以下之间有什么区别?
FROM table1
LEFT JOIN table2 ON table1.key = table2.key
LEFT JOIN table3 ON table2.key = table3.key
Run Code Online (Sandbox Code Playgroud)
和:
FROM table1
LEFT JOIN table2
LEFT JOIN table3
ON table2.key = table3.key
ON table1.key = table2.key
Run Code Online (Sandbox Code Playgroud)
结果似乎是一样的。
由于有评论和答案说第二种语法无效,我将澄清 - SQL Server、PostgreSQL 和 MySQL 都可以很好地接受这两种变体。我还使用一个具有自己的 TSQL 实现的平台,该平台将其自己的实现转换为它实际连接到的提供程序之一,第二个变体是默认情况下它如何从可视化编辑器编写代码。
在第一个答案之后,我决定添加第二种类型的更复杂的示例:
SELECT table1.Name AS MainData, table3ParentParent.Name AS AdditionalData
FROM table1
LEFT JOIN table2
JOIN table3
JOIN table3 AS table3Parent
JOIN table3 AS table3ParentParent
ON table3Parent.Parent = table3ParentParent.key
ON table3.Parent = table3Parent.key
ON table2.table3_id = …Run Code Online (Sandbox Code Playgroud) 我想做一个SELECT DISTINCT guid, ...,但我不想guid出现在记录集中.我该怎么做呢?
假设我有以下任一表达式:
SELECT
DATE '2014-01-01' < '2014-02-01',
DATE '2014-01-01' < '321',
9 < '10',
9 < 'a'
Run Code Online (Sandbox Code Playgroud)
SQL 标准中是否有关于如何比较这些的建议或要求?我想这三个级别或“严格性”如下:
似乎BigQuery使用第二种方法,postgres使用类似2/3的东西(只有最后一个失败),mysql使用3或4(没有失败)。
标准在这里有什么建议吗?
我们正处于设计具有多个模块的大型业务应用程序的早期阶段.其中一个要求是应用程序应该独立于数据库,它应该支持SQL Server,Oracle,MySQL和DB2.
根据我在网上看到的内容,数据库独立性是一个非常糟糕的主意:它会导致难以维护的代码,数据库设计在所有受支持的DBMS中具有最不常见的功能,性能差和可扩展性差.我个人的直觉是,这个功能的复杂性,比任何其他功能更多,可能会以指数方式增加开发成本和时间.代码将是可怕的.
但我不能说服任何人忽略这个功能.问题是关于这个问题的大多数数据都是经验数据,缺乏支持案例的数字.如果有人可以在这个问题上分享任何数字支持的数据,我将不胜感激.
其中一个可能的设计选项是将Entity框架用于数据库层,并为每个DBMS使用提供程序.我个人的感觉是,在没有任何ORM的情况下手动编写SQL语句将是"必须",因为您无法控制实体框架生成的SQL,并且独立于数据库的场景需要基于DBMS进行一些SQL调整,代码是定位,我认为第三方实体框架提供商将有大量的错误,这些错误只出现在应用程序将具有的复杂场景中.我希望听到之前有过使用实体框架进行数据库独立场景的经验的人.
此外,团队讨论的一种可能性是在第一次迭代中支持一个DBMS(例如SQL Server),然后在连续迭代中添加对其他DBMS的支持.我想,既然我们需要一个数据库的设计与最常见的功能,这一发展战略是不好的,因为我们需要知道的所有数据库的所有功能之前,我们开始第一个DBMS编写代码.我也需要听听你关于这种可能性的消息.
我有一个表格,如下所示:
OrderNo, OrderType
1, Type1
2, Type1
3, Type2
4, Type3
5, Type4
Run Code Online (Sandbox Code Playgroud)
在OrderType上执行"分组依据"很简单,但有没有办法做"分组依据"来得到类似的东西:
OrderCount, OrderType
2, Type1
3, Not Type1
Run Code Online (Sandbox Code Playgroud)
这是DB2,但理想情况下,我正在寻找一种无论数据库供应商如何都能运行的解决方案.