如何将N数据库表与一个主表绑定?

时间:2013-03-20 02:22:12

标签: sql database database-design relational-database

假设我有N个书店的N个表。我必须在每个书店的单独表中保存有关书籍的数据,因为每个表都有不同的方案(列的数量和类型不同),但是所有Bookstores表都有相同的列集;

现在我想用一些列创建一个“MasterTable”。

|   MasterTable   |
|id. | title| isbn|     
| 1  | abc  | 123 |


| MasterToBookstores |
|m_id | tb_id | p_id |
| 1   |   1   |  2   |
| 1   |   2   |  1   |


|       BookStore_Foo          |
|p_id| title| isbn| date | size|     
| 1  | xyz  | 456 | 1998 | 3KB |
| 2  | abc  | 123 | 2003 | 4KB |

|       BookStore_Bar                  |
|p_id| title| isbn| publisher | Format |     
| 1  | abc  | 123 |   H&K     |   PDF  |
| 2  | mnh  | 986 |   Amazon  |   MOBI |

我的问题是,以这种方式保存数据是否正确?关于这个和类似案例的最佳做法是什么?我可以给特定的Bookstore表一个带数字的别名,这有助于我管理整套表吗?

有没有更好的方法来做这样的事情?

4 个答案:

答案 0 :(得分:5)

我认为你混淆了“商店”和“书”的概念。

从你的评论和示例数据来看,问题在于书籍而不是商店具有不同的属性集。如果是这样,您将需要一个类似于此的结构:

enter image description here

符号:enter image description here表示继承 1 。 BOOK是“基类”,BOOK1 / BOOK2 / BOOK3是各种“子类” 2 。当实体共享一组属性或关系 3 时,这是一种常见的策略。有关此概念的更全面解释,请在ERwin Methods Guide中搜索“子类型关系”。

不幸的是,当前关系数据库并不直接支持继承,因此您需要将此层次结构转换为普通表。这样做通常有3种策略,如这些帖子所述:

注意:上述结构允许在同一书店内混合各种书籍类型。让我知道这是不可取的(即你在任何给定的书店只需要一种类型的书籍)......


1 Aka。类别,子类化,子类型,泛化层次等。

2 I.e。书籍的类型,取决于他们需要的属性。

3 在这种情况下,所有类型的书籍都与商店存在多对多的关系。

答案 1 :(得分:4)

如果您至少有两列所有其他表都使用它,那么您可以拥有所有书籍的基表,并使用Base表中的id为其余数据添加更多表。

更新:

如果您使用实体框架连接到您的数据库,我建议您尝试这样做:

创建您的实体模型,如下所示:

Entities model

然后让实体框架为您生成数据库(从模型更新数据库)。请注意,这使用继承(不在数据库中)。

如果您有疑问,请告诉我。

答案 2 :(得分:2)

建议数据模型:
1.拥有一个主数据库,用于保存主数据
2. master数据库中的维度表,transtional复制到您的分布式书店数据库
3.您可以选择使用可更新的scriscriber或合并复制也是一个不错的选择 4.每个分布式书店数据库仍然独立工作,但主数据或者通过合并复制或可更新订户合并。
5.如果要确保主数据完整性,则只能使用只读订阅者,并使用转换复制将主数据分发到分布式数据库中,但在此设计中,您需要在master数据库中具有存储过程以注册维度数据。确保没有双跳问题。

答案 3 :(得分:2)

我建议你有两张桌子:

书店

id name someMoreColumns

图书

id bookStore_id title isbn date publisher format size someMoreColumns

很容易看到这里的关系:bookStore有很多books

请注意我将所有BookStore表中的所有列放在一个表中,即使某些表中的某些行没有某个​​列的值。

为什么我更喜欢这种方式:

1)对于来自BookStore表的所有数据,只有少数列从不在表books上具有值(例如,size和{ {1}}如果您没有电子书版本)。有一天可以填写其他列(您可以为您的电子书设置format,但您的表date上没有此列,这似乎是指电子书) 。这样,如果有一天您想要更新它,您可以从所有书中获得更详细的信息。

2)如果您有一堆表BookStore_Bar,请说12,您将无法轻松处理数据。我所说的是,如果你想对你的所有书籍(这意味着你的所有表格)都运行一些查询,你将至少有三种方式:

  • 首先:手动运行查询到12个表中的每个表,然后合并数据;

  • 第二:在您的BookStore子句中编写一个包含12个联接的查询或设置12个表来查询您的所有数据;

  • 第三:依赖某些脚本,存储过程或软件为我做的第一种或第二种方式;

我希望能够尽可能简单地处理我的数据,而不依赖其他一些脚本或软件,除非我真的需要它。

3)从MySQL开始(因为我对MySQL了解得更多),您可以在表FROM上使用partitions。这是一种高级别的数据管理,您可以将表中的数据分发到磁盘上的多个文件而不是一个,就像分配表一样。在同一个表中处理大量数据时,它非常有用,它可以根据您的数据分发计划加快查询速度。让我们看一个例子:

假设您已经有12个不同的书店,但在我的数据库模型下。对于表books中的每一行,您将与12个bookStore之一建立关联。如果您通过books对数据进行分区,它将与您拥有12个表的数据几乎相同,因为您可以为每个bookStore_id创建一个分区,因此每个分区只处理相关数据(数据)与bookStore_id匹配的。

假设您要查询表bookStore_id到{1,4}中的books。如果您的查询确实只需要这三个分区来为您提供所需的输出,那么其他分区将不会被查询,并且它将与查询每个分离的表一样快。

您可以删除分区,而另一个分区不会受到影响。您可以添加新分区来处理新的书店。您可以对分区进行子分区。您可以合并两个分区。简而言之,您可以将单个表bookStore_id置于易于处理的多存储表中。

副作用:

1)我不知道所有的表分区,所以最好参考文档来了解创建和管理它的所有要点。

2)使用常规备份(转储)处理数据,因为您可能有一个非常填充的表books

我希望它可以帮到你!