面向对象的程序员如何了解数据库驱动的编程?

2024-03-29

我已经使用 C# 和 Java 编程一年多了,并且对面向对象编程有了很好的掌握,但是我的新副项目需要数据库驱动的模型。我正在使用 C# 和 Linq,这似乎是一个非常强大的工具,但我在围绕面向对象的方法设计数据库时遇到了麻烦。

我的两个主要问题是:

如何处理数据库中的继承?假设我正在构建一个员工排班应用程序,并且我有一个抽象类 Event。我从 Event 派生抽象类 ShiftEvent 和 StaffEvent。然后我有具体的类 Shift (派生自 ShiftEvent)和 StaffTimeOff (派生自 StaffEvent)。还有其他派生类,但为了论证,这些已经足够了。

我应该为 ShiftEvents 和 StaffEvents 使用单独的表吗?也许我应该为每个具体类别设置单独的表?这两种方法似乎都会在与数据库交互时给我带来问题。另一种方法可能是拥有一个事件表,并且该表对于我的任何具体类中的每种数据类型都具有可为空的列。所有这些方法都感觉可能会阻碍未来的可扩展性。很可能还有我没有考虑过的第三种方法。

我的第二个问题:

如何以面向对象的方式处理集合和一对多关系?

假设我有一个产品类和一个类别类。类别的每个实例将包含一个或多个产品,但产品本身不应该了解类别。如果我想在数据库中实现这一点,那么每个产品都需要一个映射到类别表的类别 ID。但这引入的耦合比我从面向对象的角度所希望的要多。产品甚至不应该知道类别的存在,更不用说有一个包含类别 ID 的数据字段了!有没有更好的办法?


Linq to SQL 使用每类一个表的解决方案:

http://blogs.microsoft.co.il/blogs/bursteg/archive/2007/10/01/linq-to-sql-inheritance.aspx http://blogs.microsoft.co.il/blogs/bursteg/archive/2007/10/01/linq-to-sql-inheritance.aspx

其他解决方案(例如我最喜欢的 LLBLGen)允许其他模型。就我个人而言,我喜欢带有鉴别器列的单表解决方案,但这可能是因为我们经常跨继承层次结构进行查询,因此将其视为普通查询,而查询特定类型只需要更改“where”。

总而言之,我个人认为将 OO 映射到表中是本末倒置。人们不断声称 OO 和关系之间的阻抗失配问题已经得到解决……而且已经有大量 OO 特定的数据库。它们都没有改变这种关系的强大简单性。

相反,我倾向于在设计数据库时考虑应用程序,将这些表映射到实体并从那里构建。有些人认为这是设计过程中面向对象的损失,但在我看来,数据层不应该仅仅因为您使用了关系模型就对您的应用程序进行足够高的讨论以影响高阶系统的设计用于存储.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

面向对象的程序员如何了解数据库驱动的编程? 的相关文章

  • 什么是依赖注入的 Pythonic 方式?

    介绍 对于 Java 依赖注入作为纯 OOP 工作 即您提供要实现的接口 并在框架代码中接受实现定义的接口的类的实例 现在对于 Python 您可以执行相同的操作 但我认为该方法对于 Python 而言开销太大 那么如何以 Pythonic
  • T-SQL 跳过获取存储过程

    我在这个网站上似乎运气不太好 但我仍然是个乐观主义者 我会继续努力 我有两个表 期刊和文章类别 使用此查询连接 SELECT Journals JournalId Journals Year Journals Title ArticleCa
  • 带有mysql的实体框架,linux和windows之间的表大小写问题

    我们目前正在开发一个使用 Code First Entity Framework 和 Mysql 的产品 开发数据库托管在 Windows 环境中 而生产 mysql 则托管在 Linux 环境中 我遇到的问题是 mysql 中的表命名如下
  • MS Access 2007 中 NVL 功能的替代方法是什么

    我在 MS Access 中编写了一个 SQL 查询 select NVL count re rule status 0 from validation result re validation rules ru where re cycl
  • BigQuery 中的 EXP() 返回浮点错误

    我有以下查询 SELECT EXP col FROM project dataset tablename Where col is FLOAT 但是 我收到此错误 Error Floating point error in function
  • ORA 00904 错误:无效的标识符

    我已经在虚拟 XP 中安装了 Oracle 10g 并使用以下命令创建了一个表 create table reg1 fname varchar2 30 lname varchar2 30 addr varchar2 30 mail varc
  • 查找包含具有指定名称的列的所有表 - MS SQL Server

    想要改进这篇文章吗 提供此问题的详细答案 包括引用和解释为什么你的答案是正确的 不够详细的答案可能会被编辑或删除 是否可以查询包含以下列的表名 LIKE myName 搜索表 SELECT c name AS ColumnName SCHE
  • 为什么sql表名中通常使用下划线而不是驼峰式大小写[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 基于 MySQL 中的另一列创建计算列

    我的表中有 2 列 varchar 8 and an int 我想要auto increment the int column当我这样做时 我想将值复制到varchar 8 column 但用 0 填充它直到它达到 8 个字符长 因此例如
  • 在 pymssql 中重复死锁查询后更新失败

    我将 SQL Server 与 pymssql 一起使用 发现一个特别复杂的 SELECT 查询偶尔会被选为死锁受害者 因此 我将其包装在 while 循环中 以便在发生这种情况时重试事务 大致如下 while True try curso
  • 使用动态 SQL 检索表结构

    我正在迁移数据库 并尝试将表结构信息检索到单个行项目中以进行机器处理 由于技术原因 现有的迁移工具无法使用 必须采用这种方式处理 我已在多个表上成功运行以下查询 SELECT LISTAGG column name data type da
  • 如何使用 CodeIgniter 计算 MySQL 中给定行之前的行数?

    简单来说 如何计算某一行之前有多少行 我使用的是增量 ID 但行是随机删除的 因此仅检查 ID 是行不通的 比如说 如果我有 30 行 并且我根据名称 或任何实际内容 选择了一行 那么在该行之前有多少行 它可以是 16 1 12 或任何值
  • C# 和 .NET 的“最佳”数据访问框架/方法是什么?

    编辑 我将其设为社区维基 因为它更适合协作格式 有多种方法可以从 NET 访问 SQL Server 和其他数据库 一切都有其优点和缺点 这永远不会是一个简单的问题 哪个是 最好的 答案永远是 这取决于 然而 我正在寻找在不同级别的系统背景
  • Linq:方法无法转换为存储表达式

    我目前正在尝试限制哪些用户可以访问哪些组 并通过使用 linq 来做到这一点 当我将相关组添加到视图时 出现了我的问题 我不断收到的错误是 LINQ to Entities 无法识别方法 System String GetUserId Sy
  • 将 linq 查询转换为字符串数组 - C#

    将单列 linq 查询转换为字符串数组的最有效方法是什么 private string WordList DataContext db new DataContext var list from x in db Words orderby
  • 如何设置报表服务器实例?

    我正在尝试设置 Microsoft SQL Server Reporting Services 我打开 Reporting Services 配置管理器 它要求输入服务器名称 问题是 我不知道服务器名称 因为据我所知还没有设置报表服务器 那
  • 没有 if 条件(动态查询)或乱码的Where子句中的PreparedStatement“为null”

    假设我有这样的查询 SELECT FROM CUSTOMERS WHERE CUSTOMER ID 使用PreparedStatement 我可以绑定变量 pstmt setString 1 custID 但是 我无法通过以下绑定获得正确的
  • MySQL 1443:这是什么意思?

    我正在尝试在 MySQL 5 0 中进行以下形式的更新 update mytable myfield t set f blah where t id in select v id from myview v where MySQL 告诉我
  • 从文件执行db语句

    我在我的应用程序中使用嵌入式 Apache derby 我有一个名为的 SQL 脚本创建的数据库 sql创建数据库中的所有表并用初始数据填充它 例如 SET SCHEMA APP CREATE TABLE study study id bi
  • 包含不同类型的两个集合相交

    假设我有一个集合 称之为ids它是类型IEnumerable

随机推荐

  • $_SERVER['QUERY_STRING'] 不按原样打印 unicode 值

    http localhost fw api fw api php rule unicode action create phrase 我访问上面的网址 在fw api php 当我回显 SERVER QUERY STRING 它没有给出 U
  • 使用 TensorFlow .pb 图作为 Keras 模型

    我使用内置 TensorFlow 工具来微调 InceptionV3 模型的最后一层 以便对自定义数据集上的项目进行分类本教程 https www tensorflow org tutorials image retraining 这会生成
  • 如何在不使用 API 的情况下向 Drupal 6.x 注册用户?

    我们必须有一个通过用 java 编写的 Web 服务可用的 注册 方法 因此从今往后我们无法访问 Drupal API 但我们需要能够成功注册用户 简单地将用户添加到用户表中是行不通的 因为新创建的用户永远无法成功登录 我再次喜欢 Drup
  • Apache 设置 000-default.conf 文件

    我确信这是一个简单的问题 我已经流浪了一台机器并设置了 LAMP IP 配置为 10 0 0 10 在我的 Windows 计算机中 我修改了主机文件并添加了一个名为 rsywx remote 的条目 从我的 Windows 机器到我的 v
  • R中的标准评估和非标准评估

    我对 dplyr 函数的参数感到困惑 并且不太清楚标准评估 SE 或非标准评估 NSE 我只想将变量传递给 dplyr arrange 但失败了 但是 传递给 dplyr select 是有效的 gt library dplyr gt li
  • width=device-width 在移动 IE 中不起作用

    我正在尝试制作一个在手机上运行良好的网站 到目前为止 我测试过的每部手机都运行良好 但装有 Windows Mobile IE 的手机除外 看来 Mobile IE 只是读取了并且没有将宽度设置为设备宽度 有人有这方面的经验或任何让网站在移
  • 使用 Django Rest Framework,如何上传文件并发送 JSON 有效负载?

    我正在尝试编写一个 Django Rest Framework API 处理程序 它可以接收文件以及 JSON 有效负载 我已将 MultiPartParser 设置为处理程序解析器 然而 我似乎无法两者兼得 如果我将有效负载与文件一起作为
  • Doxygen 注释的“使用命名空间”

    我的库的所有类都是在命名空间内定义的 当我为 Doxygen 创建主页时 我必须在注释中显式使用此命名空间以使 Doxygen 生成链接 我想对整个评论块使用类似 使用命名空间 的内容 一个例子 mainpage My Library Us
  • java.lang.IllegalStateException:getWritableDatabase 递归调用

    请帮我解决该错误 D AndroidRuntime 836 Shutting down VM W dalvikvm 836 threadid 1 thread exiting with uncaught exception group 0x
  • Vite - 静态文件不复制

    我有一个 Vue js 应用程序依赖于Vite https vitejs dev 在此应用程序中 我有两个静态文件需要复制到我的dist目录 favicon ico and manifest json My vite config js文件
  • Python MySQLdb 迭代表

    我有一个 SQL 数据库 我需要迭代表并在满足 WHERE 子句后执行操作 然后 一旦到达表的末尾 就返回到顶部并重新开始 目前我有 cursor database cursor cursor execute SELECT user id
  • 如何从特权容器访问docker主机文件系统

    不使用卷 v 我可以添加 privileged to docker run但我无法安装任意卷 因为我依赖另一个工具来创建 docker 容器 所以我的问题是如何完全访问 docker 主机文件系统 privileged true 够了吗 特
  • jQuery:如何检测元素是否未被单击?

    我想知道是否可以检测某个元素是否未被单击 这是我的代码 mpElement myFeature afterDo function This if else statement has to go inside when not clicke
  • 如何在 iOS 6.1 上正确设置 GKSession(蓝牙)

    我在让 GKSession 工作时遇到问题 下面是我的代码 当按下特定按钮时执行 GKSession session if connectButtonHasBeenPressed false NSLog connectToBluetooth
  • 仅当用户启用了 JavaScript 时才使用一些 CSS

    为了让我的网页正常降级 我有一些 CSS 只有在其相应的 JavaScript 能够运行时才应该加载它们 当且仅当浏览器启用了 JavaScript 时 加载本地 CSS 的最简单方法是什么 而且它是一个相当大的 CSS 块 所以我不想编写
  • 使用 WinHttp 发布表单

    在向服务器发布帖子之前我需要添加任何标头吗 例如 目前我正在尝试以这种方式发送请求和发布数据 LPCWSTR post L name User subject Hi message Hi if WinHttpSendRequest hReq
  • 微软图表:透明度

    我想要一个具有透明背景的图表 因此 PNG 似乎是一个不错的选择 但是当我设置透明背景时 轴标签的质量急剧下降 我该如何解决 请参阅以下代码 就目前情况而言 图表具有透明背景 正如我所希望的那样 但文本质量很差 如果我注释掉两个 Color
  • 使用 Windows 窗体在脚本终止后几分钟锁定 PowerShell ISE

    我这里有一个有趣的问题 我正在创建一个日历选择器 供我们创建帐户时使用 它工作正常并且仍在进行中 但我注意到当我在 powershell ISE 中运行脚本时 几分钟后它会锁定 我可以在此之前编辑并保存代码几分钟 事件日志中没有任何内容 我
  • ng-animate :模型更改时的动画

    我创建了一个表 用户可以在其中增加和减少值 请参阅Fiddle http jsfiddle net AnandVishnu c5p39 sample code as its not allowing me to push the link
  • 面向对象的程序员如何了解数据库驱动的编程?

    我已经使用 C 和 Java 编程一年多了 并且对面向对象编程有了很好的掌握 但是我的新副项目需要数据库驱动的模型 我正在使用 C 和 Linq 这似乎是一个非常强大的工具 但我在围绕面向对象的方法设计数据库时遇到了麻烦 我的两个主要问题是