mySQL 中应如何构建分层数据

How should hierarchical data be structured in mySQL

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

我知道无论是在普通编程还是 OO 编程中,您都喜欢将所有内容都放在 modules/objects 中。因此,最好为 DOOR 和 HANDLE 对象使用 class,而不是使用变量定义其句柄的 DOOR class。关系型数据库也是这样吗

这里有两种描述收发器的方式。我可以用这样的布尔变量创建一个 table

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;

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

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 个不同的 table,整个事情就会变成一场噩梦。

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

编辑 我只是发现我的示例中没有层次结构,但是,我可以这样进行:

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

  2. 联接和联合不是关系 DBMS 的问题,它们是它们的一些最佳特性。构建关系并从记录的事实中获取信息的能力使关系 DBMS 成为可以回答问题的有用且智能的代理,而不是仅存储和检索字节的愚蠢记录存储。

  3. 当数据库设计良好时,我很少需要连接 15 个表,但当我这样做时,这样做通常既简单又高效。

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

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