(难题)如何在不同的sql server中存储表的特定行?

时间:2009-05-28 00:05:27

标签: sql sql-server replication

我在这里遇到了一些架构问题。假设我有两个表,教师学生,两者都在不同的服务器上。由于这些表共享大量数据和功能,因此我想使用this inheritance scheme并创建人员表;但是,我需要在一台服务器中保留教师表和相关教师的记录,学生表格和人员记录将学生与另一台服务器相关联。这是首席开发人员的要求,因为我们有太多(并且我的意思是太多)教师学生的记录,以及包含所有这些记录的单个数据库人们会崩溃。此外,客户需要将它们放在不同的服务器上(叹气*)。

我真的想实现继承方案,因为很多功能可以在数据库之间共享。有没有办法做到这一点?任何其他可能适合此类问题的架构?我只是疯了吗?

---编辑---

好吧,我本身并没有教师和学生,我只是用这些名字来简化我的解释。事实上,大约有9个子表可以继承超级表,所有这些子表都在不同的服务器中用于单独的应用程序,不,我没有this类型的数据库,但我们的端点很低我们拥有的交易量的服务器;)。你是对的,我的陈述有点夸张,我为此道歉,这只是为了让你们回答得更快(对不起:P)。不同的服务器更多的是业务限制(尽管主要的开发人员DID说存储SuperTable的公共数据库会在它自身的重量下崩溃 - 这个词,而不是我的:S)。我们的客户不喜欢他们的信息与其他客户信息混在一起,所以我们必须将他们的信息放在不同的服务器上 - 这很愚蠢,但决策者已经说过:(。

9 个答案:

答案 0 :(得分:3)

在什么假设下你确定你有太多的数据?我很确定你可以列出世界上的每一位老师和学生,而不会让SQL Server感到悲伤。

这似乎是一个随意的决定,会对您设计的任何解决方案的复杂性产生重大影响。

看看here - 我确定你没有在接近本页所示比例的任何地方测量你的数据库,而且其中许多数据库都在SQL Server上运行。

答案 1 :(得分:1)

我不确定这是否可以通过SQL Server专门实现,但它有点像可以通过集群和表空间分区解决的问题。

我想知道这是否真的是一个好的要求;它引入了很多技术复杂性,基于一个非常简单的断言,即数据太多了。你试过验证这个吗?一个简单的测试是创建一个简单的模式,并使用虚拟数据填充它,以获得您在生产中期望的行数。在你走得太远以实现这个“要求”之前,进行这项测试可能符合你的最佳利益。

顺便说一句,您链接到的架构类型是class table inheritance pattern的一个示例。

您可以为此项目实施domain modelTeacherStudent的公共属性由Person接口或基类描述写下常见的操作。如果您计划广泛使用存储过程,这可能不是一个有用的选项,但需要考虑。

答案 2 :(得分:0)

我认为保罗是正确的 - 也许看看你的硬件基础设施而不是你的数据库架构。

使用群集,正确的索引以及可能的数据归档方案应该解决任何性能问题。继承方案似乎是最好的数据模型。

可以在多个服务器上拆分数据并保留方案,但我认为你肯定会遇到比查看群集/正确索引更多的性能问题。通过设置链接服务器,您可以执行跨服务器查询。

e.g。学生查询

SELECT *
FROM SERVER_A.People.dbo.Persons P
    INNER JOIN SERVER_B.People.dbo.Students S
        ON P.PersonID = S.PersonID

- 编辑 - 正如Paul所说,你可以在你的抽象层中执行数据库分离。

E.g。让您的Student类扩展您的Person类。在Person类构造函数中,让它连接到服务器A以填充可用的字段。在您的学生类构造函数中,让它连接到服务器B(Person属性已经由Person构造函数填充)。

答案 3 :(得分:0)

我和亚伦在一起(亚伦)。将表移动到单个数据库中。 SQL Server可以轻松处理每个表的数十亿行(我在6 - 7年前在SQL 2000上完成了它,因此现代版本和现代硬件都没有问题)。只要你的表被正确编入索引世界上每所学校的学生可能都没有足够的学生在一所学校中过多地减少SQL Server的负担。

在这种情况下,您的最佳做法是将表放在同一服务器上的相同数据库中并对其进行索引以获得更好的性能。

答案 4 :(得分:0)

太多记录会导致“数据库崩溃”?引导开发者吸烟的是什么样的锅?有力的东西!

我建议你先学习partitioned tables。分布式应用程序(实际上是两种服务器方法所暗示的)比您想象的要困难得多,并且提供可伸缩性。

答案 5 :(得分:0)

是的,我必须同意这里的其他人,单个数据库,单服务器就好了。与扩展到联合服务器相比,当前扩展硬件以支持工作负载要容易得多,也更便宜。我只知道一个联合服务器的地方,他们的工作量非常惊人。

答案 6 :(得分:0)

链接服务器并创建视图

SELECT
  FirstName
    ,LastName
    ....
  FROM server.database.owner.Teachers
UNION
  FirstName
    ,LastName
    ....
  FROM server.database.owner.Students

答案 7 :(得分:0)

您使用的是哪种客户?如果您使用的是Java客户端,并且正在使用ORM,则可能需要查看Hibernate Shards

答案 8 :(得分:0)

除了这里的所有好答案之外,问题背后的假设是非常值得怀疑的,如果我需要认真对待(如果我认为这些假设是真的那样),我会比较Oracle提供的内容,因为它在这里它显示了一种好处的场景类型(我从经验中说出这一点)。

但是在核心问题上,假设你所概述的假设是正确的,我不会尝试使用组合表。如果教师和学生不能在同一个数据库中,那么他们的识别信息就不太可能,如果数据量太大,那么把它全部放在一个表中会更糟糕。

我怀疑的是,如果基本的假设是正确的,那是因为预期会对表进行大量争用以及对表进行大量的连接和活动,从而导致大量锁定。在这种情况下,添加Person表会使事情变得更糟。

所有这一切,如果您仍然真的想这样做,那么您可以通过链接数据库在查询中引用另一个数据库。

但如果真正的问题是表的连接数和争用数以及死锁数,那么这样的解决方案会让事情变得更糟。

编辑:回应那些质疑Oracle会给这种情况带来什么好处的人,一个人会在联邦数据库领域,在那里它更加成熟。另一种情况是在表中存在大量争用,它会在某些情况下复制数据,并且通常在处理争用时其模型更复杂。例如,在较长时间运行的查询中读取表的情况,导致大量潜在的读锁定。 Oracle可帮助您保持事务完整性,而无需锁定读取。在MS-SQL中,您必须使用脏读。

MS-SQL是一个很好的数据库,但它有其局限性(没有关于读写量的任何特定参数的原始数据量实际上不是其中之一,这使得这个问题很奇怪)。鉴于激烈的竞争,非企业版的Oracle在价格上非常接近值得一看。它最终会花费你很多钱。

当然,如果您已经购买了MS-SQL许可证,那么Oracle的成本因素会更大,因此必须更加明显。