如何在mySQL中构建分层数据

时间:2015-07-31 21:09:49

标签: mysql relational-database

我们正在设计一个数据库来跟踪网络,包括服务器,交换机和摄像头。我们注意到表定义中有大量的继承。例如,所有交换机都有一个IP地址,但有些有48个端口,有些只有24个,有些有SFP端口,有些有两个电源,有些只有一个。

我知道无论是在普通编程还是OO编程中,您都希望将所有内容都放在模块/对象中。因此,最好为DOOR和HANDLE对象创建一个类,而不是让DOOR类定义其句柄的变量。这与关系数据库是否相同。

以下是描述移交者的两种方式。我可以创建一个带有布尔变量的表,如此

CREATE TABLE IF NOT EXISTS Transceiver
(
   ID INT NOT NULL AUTO_INCREMENT,
   singleMode BOOL,
   multiMode BOOL,
   1Gig BOOL,
   10Gig BOOL,
   1km BOOL,
   10km BOOL,

   PRIMARY KEY (ID)
)ENGINE=InnoDB;

或者我可以像这样创建多个表

CREATE TABLE IF NOT EXISTS MM1G1KmTransceiver
(
   ID INT NOT NULL AUTO_INCREMENT,

   PRIMARY KEY (ID)
)ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS MM10G1KmTransceiver
(
   ID INT NOT NULL AUTO_INCREMENT,

   PRIMARY KEY (ID)
)ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS MM1G10KmTransceiver
(
   ID INT NOT NULL AUTO_INCREMENT,

   PRIMARY KEY (ID)
)ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS MM10G10KmTransceiver
(
   ID INT NOT NULL AUTO_INCREMENT,

   PRIMARY KEY (ID)
)ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS SM1G1KmTransceiver
(
   ID INT NOT NULL AUTO_INCREMENT,

   PRIMARY KEY (ID)
)ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS SM10G1KmTransceiver
(
   ID INT NOT NULL AUTO_INCREMENT,

   PRIMARY KEY (ID)
)ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS SM1G10KmTransceiver
(
   ID INT NOT NULL AUTO_INCREMENT,

   PRIMARY KEY (ID)
)ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS SM10G10KmTransceiver
(
   ID INT NOT NULL AUTO_INCREMENT,

   PRIMARY KEY (ID)
)ENGINE=InnoDB;

关系数据库的问题在于你必须使用联接和联合,如果你有15个不同的表,整个事情就会变成一场噩梦。

如果有人想知道,我们稍后需要生成物料清单,因此我们可能需要找出单模收发器的总数,或PSU的总数,或所有24端口交换机的功耗,等

修改 我只是觉得我的例子中没有层次结构,但是,我可以这样做:

  • 收发器表
  • 指向收发器表的单/多模收发器表

1 个答案:

答案 0 :(得分:2)

  1. 您可以将相关的布尔列组合到单个域中。例如,1Gig和10Gig可以组合成一个速度整数列,1km和10km到一个Range整数列,如果singleMode和multiMode是互斥的,你只需要记录其中一个。

  2. 关联和工会不是关系型DBMS的问题,它们是一些最好的功能。组合关系和从记录的事实中获取信息的能力使得关系DBMS成为一个有用且智能的代理,可以回答问题而不是只存储和检索字节的哑记录存储。

  3. 当数据库设计得很好时,我很少需要加入15个表,但是当我这样做时,通常很容易和有效。

  4. 不要将面向对象的编程与关系数据库或数据建模混淆。 OO非常适合构建使用状态的状态机。 (关系型)数据建模非常适合组织状态。这两个学科是正交的。

  5. 我认为您的数据不需要层次结构。