2011-03-25 72 views
0

您可以对以下设计发表评论。 我是否正在用这种设计来破坏自己?我一直在反复设计系统,因为全新的要求不能在设计中被破解,所以现在我正在寻找具有最灵活系统的长期解决方案。universal db schema

有了这个设计,我可以动态地创建下面的复杂性和设计,现在我意识到实现不会很直接,所以在我花上几天的时间之前,我想获得一些真正的输入。

这是常见的否定或是共同的吗? 任何输入将不胜感激。 schema

instance 
    firstname bob 
    lastname gates 
    scoreone 20 
    scoretwo 90 
    scorethree 
     scorethreePart1 30 
     scoreThreePart2 32 


    CREATE DATABASE uni; 
use uni; 

CREATE TABLE instance (
ID       INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
ParentID     INT DEFAULT NULL, 
FOREIGN KEY   (ParentID) REFERENCES instance(ID) ON DELETE CASCADE 
) ENGINE=InnoDB; 

CREATE TABLE keyval_connector (
ID       INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
ParentID     INT NOT NULL, 
TextKey      VARCHAR(255) NOT NULL, 
Note      TEXT DEFAULT NULL, 
UNIQUE(ParentID, TextKey), 
FOREIGN KEY   (ParentID) REFERENCES instance(ID) ON DELETE CASCADE 
) ENGINE=InnoDB; 
CREATE TABLE keyval_int (
ID       INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
ParentID     INT NOT NULL, 
Value      INT DEFAULT NULL, 
UNIQUE(Value), 
FOREIGN KEY   (ParentID) REFERENCES keyval_connector(ID) ON DELETE CASCADE 
) ENGINE=InnoDB; 

CREATE TABLE keyval_varchar (
ID       INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
ParentID     INT NOT NULL, 
Value      VARCHAR(255) DEFAULT NULL, 
UNIQUE(Value), 
FOREIGN KEY   (ParentID) REFERENCES keyval_connector(ID) ON DELETE CASCADE 
) ENGINE=InnoDB; 

CREATE TABLE keyval_double (
ID       INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
ParentID     INT NOT NULL, 
Value      DOUBLE DEFAULT NULL, 
UNIQUE(Value), 
FOREIGN KEY   (ParentID) REFERENCES keyval_connector(ID) ON DELETE CASCADE 
) ENGINE=InnoDB; 

CREATE TABLE keyval_datettime (
ID       INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
ParentID     INT NOT NULL, 
Value      DATETIME DEFAULT NULL, 
UNIQUE(Value), 
FOREIGN KEY   (ParentID) REFERENCES keyval_connector(ID) ON DELETE CASCADE 
) ENGINE=InnoDB; 
+0

除了以上提到的问题,已经低于升起,你是在执行数据库内的一致性时为自己设定一个痛苦的世界。不要做! – 2011-03-25 15:37:17

+0

感谢大家的意见!这正是我所期待的,我认为你已经说服我不要走这条路,因为实施不会那么直截了当,除了看起来有人为这个概念申请专利而不是进入这个领域! – user391986 2011-03-25 17:43:04

回答

3

它看起来像你要去Entity-Attribute-Value (EAV) Model,它在某些情况下有其用途。不知道您的要求的具体情况,很难说这是否是有效的用例。

1

不用告诉我们这样一个数据库模式应该是什么应用程序支持,我们真的不能发表评论。但是,通常情况下,数据库模式应该至少在某种程度上反映一个或多个特定域的应用程序和数据。

然而,为了避免未来重构而插入一个图层对我来说听起来不太有吸引力,至少不是没有明确的优势,对于正在开发的代码现在,例如引入更多适合您的数据的存储模型。

正因为如此,我能看到的是指数的一大堆(由PRIMARY KEYUNIQUE限制暗示)和外键,这是一个出色的方式带来任何DB服务器到其膝盖...

1

似乎它可以很好地存储单个键值对。但是,如何搜索“第一个名字是弗雷德或罗杰,并且在一场比赛中至少得分23分”,而不必在同一张桌子上进行一连串重复的混淆连接?

你基本上忽略了关系数据库的重点和目的,并将其纯粹用作关键值存储。为此,您最好还是选择其中一个NoSQL数据库。

3

如果我理解你的模式,你正在做的是建立一个名称/值存储系统,与你想支持(日期,数字等)的数据类型特定表

这是一个完全有效的方法 - 但它带来的问题与解决方案一样多。例如,你不能以一种干净的方式真正建模数据库模式的“关系”部分。用适度复杂的逻辑创建查询是非常棘手的 - 想象用几个AND,OR和IN编写一些东西。像MIN,MAX等集合函数将很难做到。

另一个问题是,你以与其他行业不同的方式工作 - 这使得很难将新开发人员带入团队,或者使用标准工具/框架,如对象/关系映射工具,E/R图等

1

正如乔所说,它看起来像你正在创建一个EAV模型。我认为这对于稀疏数据效果最好。因此,尽量将所有实体(名字,姓氏等)共有的内容保存在一张表中,然后使用EAV模型获取更稀疏的数据或更可能随时间变化的属性。

1

尽管我可以同情你为什么这样思考,你可能正在为一个痛苦的世界而努力。关系数据库用于结构化数据,并且旨在有效地操纵它。

你有没有看着XML数据库

http://www.ibm.com/developerworks/library/x-comparexmldb/

我不建议任何特定的数据库,因为我不知道有足够的了解他们