设计模式通常与面向对象设计相关。 是否存在用于创建和编程关系数据库的设计模式? 许多问题肯定有可重用的解决方案。

示例包括表设计模式、存储过程、触发器等等……

是否有类似于martinfowler.com的在线模式存储库?


模式可以解决的问题示例:

存储分层数据(例如,单个表的类型vs多个表的1:1键和差异…) 以可变结构存储数据(例如,通用列vs xml vs分隔列…) 反规格化数据(如何在影响最小的情况下这样做,等等……)


当前回答

你的问题有点模糊,但我认为UPSERT可以被认为是一种设计模式。对于没有实现MERGE的语言,有许多替代方案可以解决这个问题(如果存在合适的行,则UPDATE;else INSERT)存在。

其他回答

这取决于你对模式的定义。如果您考虑的是个人/公司/事务/产品等,那么是的——已经有很多通用的数据库模式可用。

如果你在想工厂,单例……那么不——你不需要这些,因为它们对于DB编程来说太低了。

如果您正在考虑数据库对象命名,那么它属于约定的范畴,而不是设计本身。

顺便说一句,S.Lott,一对多和多对多关系不是“模式”。它们是关系模型的基本构建块。

设计模式不是简单的可重用解决方案。

根据定义,设计模式是可重用的。它们是您在其他好的解决方案中检测到的模式。

模式不是简单的可重用的。但是,您可以按照该模式实现向下设计。

关系设计模式包括以下内容:

One-to-Many relationships (master-detail, parent-child) relationships using a foreign key. Many-to-Many relationships with a bridge table. Optional one-to-one relationships managed with NULLs in the FK column. Star-Schema: Dimension and Fact, OLAP design. Fully normalized OLTP design. Multiple indexed search columns in a dimension. "Lookup table" that contains PK, description and code value(s) used by one or more applications. Why have code? I don't know, but when they have to be used, this is a way to manage the codes. Uni-table. [Some call this an anti-pattern; it's a pattern, sometimes it's bad, sometimes it's good.] This is a table with lots of pre-joined stuff that violates second and third normal form. Array table. This is a table that violates first normal form by having an array or sequence of values in the columns. Mixed-use database. This is a database normalized for transaction processing but with lots of extra indexes for reporting and analysis. It's an anti-pattern -- don't do this. People do it anyway, so it's still a pattern.

大多数设计数据库的人可以轻松地脱口而出半打“这是另一个”;这些是他们经常使用的设计模式。

这还不包括使用和管理的管理和操作模式。

AskTom可能是关于Oracle db最佳实践的最有用的资源。(我通常只是键入“asktom”作为谷歌查询特定主题的第一个词)

我认为用关系数据库来谈论设计模式真的不合适。关系数据库已经是一种“设计模式”对问题的应用(问题是“如何在保持数据完整性的同时表示、存储和使用数据”,而设计就是关系模型)。其他的方法(通常被认为是过时的)是导航和层次模型(我确信还有很多其他的模型存在)。

话虽如此,您可以将“数据仓库”视为数据库设计中某种程度上独立的“模式”或方法。您可能特别有兴趣阅读关于Star模式的内容。

你的问题有点模糊,但我认为UPSERT可以被认为是一种设计模式。对于没有实现MERGE的语言,有许多替代方案可以解决这个问题(如果存在合适的行,则UPDATE;else INSERT)存在。

经过多年的数据库开发,我可以说,在开始之前,有一些不应该做的事情和一些应该回答的问题:

问题:

你想在未来使用另一个DBMS吗?如果是,那么不要使用当前DBMS的特殊SQL东西。删除应用程序中的逻辑。

请勿使用:

表名和列名中的空格 表和列名中的非ASCII字符 绑定到特定的小写或大写。永远不要使用只有小写和大写不同的两个表或列。 不要使用SQL关键字表或列的名称,如“FROM”,“BETWEEN”,“DELETE”等

建议:

Use NVARCHAR or equivalent for Unicode support then you have no problems with codepages. Give every column a unique name. This make it easier on join to select the column. It is very difficult if every table has a column "ID" or "Name" or "Description". Use XyzID and AbcID. Use a resource bundle or equals for complex SQL expressions. It make it easier to switch to another DBMS. Does not cast hard on any data type. Another DBMS can not have this data type. For example Oracle does not have a SMALLINT only a number.

我希望这是一个好的开始。