当应用程序硬编码模式名称时dbo.TABLE
,它会降低 DBA 根据需要迁移数据的能力。
应用程序省略模式名称是否安全且更灵活?
我知道您会说这是“基于意见的”,但这是管理数据库的关键问题。
当应用程序硬编码模式名称时dbo.TABLE
,它会降低 DBA 根据需要迁移数据的能力。
应用程序省略模式名称是否安全且更灵活?
我知道您会说这是“基于意见的”,但这是管理数据库的关键问题。
通常应用层的对象和数据库层的表是一对一的映射关系。
每当数据库模式发生变化时,这种耦合都会导致复杂性,并且应用程序版本可能与其正在与之通信的当前数据库版本不兼容。
我读到有一种由元数据驱动的数据库设计方法。从表中找到对象可用的字段之类的东西,然后完成查询。所以某种形式的方向是为了避免版本控制问题。
这种方法是否普遍使用,具体是如何实施的?还有其他方法可以解决这个问题吗?
我想创建一个按以下方式工作的新闻应用程序:
该站点将包含文章,并且每篇文章都有多个版本。每个版本都是一个docx
文件。文章本身除了版本之外没有任何内容。该集合将如下所示:
{
Id:123,
Versions: [{id:321, docx:"blob"},{id:444, docx:"blob"}]
}
我读过 Mongo 允许您以名为 gridFs 的格式保存文件,但据我了解,它为文件保留了不同的集合,并且不允许您将文件保留为自定义集合的一部分。
有人可以建议按照我描述的方式存储数据的最佳方式是什么吗?
我需要你的智慧,我正在和另一个人辩论什么时候建议将业务规则的代码放入数据库约束或应用程序业务层内部?
有一个特定的字段用于工厂中机器设置的多个计算。今天,我们遇到了一个问题,因为文件维护人员没有指定必填字段,而该字段不知何故未在 ERP 的用户界面中验证。该字段会在计算中导致被零除错误,从而导致 PLC 机器崩溃并停止生产以重新启动 PLC 机器。
因此,我填写了一个文件维护请求,以填充所有值为零的字段,并向数据库管理员提出了第二个请求,要求在数据库中为该字段创建一个约束,以便如果必填字段为 0,则该记录将被拒绝。
DBA 拒绝了我的请求并告诉我验证 UI 或业务逻辑层中的特定字段。我告诉他,即使我这样做,Microsoft Access 中的某个人或任何其他具有正确权限的工具都可以将零分配给特定字段,这将再次停止生产。他回答我:“那又怎样?你希望我将业务逻辑层的所有业务规则重新编程为数据库约束吗?”
之后,我就在想“什么时候把业务规则放到业务应用层,或者放到数据库约束中”这个问题?
谢谢!塞巴斯蒂安
我正在创建一个用于管理事件的 Web 服务。该服务将拥有用户,这些用户列在一个名为“用户”的数据库中。它还将有事件,这些事件列在另一个数据库中,称为事件。
每个事件都会有一个受邀用户列表,其长度是可变的。每个受邀用户都有不同的属性,包括他们是否接受了邀请,以及他们是否参加了。
我打算使用 SQL 数据库;SQLite、MySQL 或 PostgreSQL。但是,如果有人建议,这可能会改变。
我的问题是我应该如何存储每个事件的受邀用户信息?要求是:
我可以同样轻松地查找受邀参加活动的用户和受邀参加的活动。
该解决方案是可扩展的,即如果我最终拥有数百万用户和数百万事件,那么该方法可以应对。请注意,每个活动只会有少量客人,例如 2-1000。
该解决方案在访问时间、计算资源和存储要求方面都很高效。
我想到的一些选择:
对于每个事件来宾列表,将用户 ID 和其他属性作为 blob 或每个属性的 blob 存储在事件数据库中。这里的问题是客人的数量各不相同。固定长度意味着浪费空间或限制最大访客长度大小。此外,这种方法不允许快速查找邀请用户参加的活动。
对于每个用户,将他们受邀参加的事件列表以及其他属性存储为用户数据库中的 blob。同样,问题在于事件的数量各不相同,并且这种方法不允许快速查找受邀参加事件的用户。
1 和 2 的组合。这引入了冗余,以及在保持两个数据库同步时发生错误的可能性。
每个事件用户列表的单独 SQLite 数据库。我怀疑这在存储和计算方面都非常低效。此外,它也不允许轻松计算邀请用户的事件。
另一个存储用户事件项目的数据库,每个用户受邀参加每个事件。这必须允许按用户或事件进行快速过滤。我是数据库新手,所以不知道这是否可以在 SQL 数据库中实现,或者需要其他类型,如果可以,是什么。
我们非常感激收到对这些选项的评论以及任何进一步的建议。
当用多个简单查询替换单个复杂查询时,我应该期望什么样的开销?
我的目标是提高所有 SQL 代码的可读性和可移植性,因此我将尽可能使用简单的结构并用 ANSI SQL 替换特定于数据库的扩展。
例如:
INSERT INTO employee SELECT name FROM user
Statement getNames = connection.createStatement();
try (ResultSet rs = getNames.executeQuery("SELECT name FROM user"))
{
while (rs.next())
{
String name = result.getString(1);
PreparedStatement prepared = connection.prepareStatement("INSERT INTO employee SET name = ?");
prepared.setString(1, name);
prepared.executeUpdate();
}
}
场景 1 不是一个复杂的查询,但为了论证起见,我们假设它是。场景 2 使用多个(更简单的)查询获得相同的结果。与场景 1 相比,场景 2 的开销是多少?这是我应该担心的事情还是可以忽略不计?
更新:https ://stackoverflow.com/a/14408631/14731提出了一个很好的观点。手动分解查询会硬编码执行计划,而不是让数据库的优化器进行选择。话虽这么说,但仍不清楚开销是否有意义。
我做了一些研究,最后得出了这个结论:
数据库实例=进程+内存
数据库=(物理)日志文件+控制文件+数据文件。
谢谢。
我正在为手机零售商构建一个库存软件。有几件事让我感到困惑。
好的,我们有:
我计划为进/出/转移做一个交易表。所以我的产品&属性&条形码表不应该有数量字段,对吧?
以下是我的业务规则
1 product, 0 or many attributes;
1 attributes, 1 to many product
1 product, 0 to many barcode;
1 barcode, 1 product
1 attributes, 0 to many barcode;
1 barcode, 1 attributes
1 barcode, 0 to many quantity
我应该为此创建多少表?
我的桌子设计是这样的:
- warehouse (warehouse id[pk])
- product (product id[pk])
- attributes (attribute id[pk])
- product attributes (product id[pfk], attribute id[pfk])
- barcode (barcode id[pk])
- stock in batch (sib_id[pk], warehouse id[fk])
- stock in batch item (item_id[pk], sib_id[fk], product id[fk], qty, unit cost)
- stock in batch item attributes (item_id[pfk], attribute id[pfk])
- stock in batch item barcode (item_id[pfk], barcode id[pfk])
- stock out batch (sob_id[pk], warehouse id[fk])
- stock out batch item (item_id[pk], sob_id[fk], product id[fk], qty, unit cost)
- stock out batch item attributes (item_id[pfk], attribute id[pfk])
- stock out batch item barcode (item_id[pfk], barcode id[pfk])
- stock transfer batch (stb_id[pk], from warehouse id[fk], to warehouse id[fk])
- stock transfer batch item (item_id[pk], stb_id[fk], product id[fk], qty, unit cost)
- stock transfer batch item attributes (item_id[pfk], attribute id[pfk])
- stock transfer batch item barcode (item_id[pfk], barcode id[pfk])
我应该有 qty 字段吗?我应该把数量放在哪里?
我正在考虑在进货和减货交易中使用 sum() 来获取产品数量,但是在考虑到我太复杂并停留在此处之后。
我也在考虑使用 qty 字段,对于每笔交易,它都会自动调整 qty 字段,但担心可能最终的数量与交易计算不符。
请指教。