【问题标题】:Design SQL tables设计 SQL 表
【发布时间】:2017-09-25 07:12:23
【问题描述】:

我有一组业务对象,它们需要存储特定于对象类型的属性。我希望用户在运行时可以定义这些属性。我的解决方案是为每个对象类型创建一个表,其中包含该对象类型的属性键。

例如,一个用户对象可能有一组属性:fname、lname、address、phone、SSN。如果需要,可以在应用程序中构建该列表,现在包括电子邮件。

然后我有一组表,其中包含给定属性的所有可能值。所以我有一个包含所有地址的表,一个包含所有电子邮件的表等。这些可能由不同的对象类型使用,并且一些属性键可能有多个值。如果创建了一个新属性,也会创建一个包含该新值集的新表。

我遇到的问题是映射所有内容,以便我可以识别每个属性、每个实例、每个对象的值。

任何关于我可能遗漏的内容、我应该研究的内容或任何其他问题解决方案的建议将不胜感激。

谢谢!

免责声明:我是一个相对论新自学的程序员。原谅任何无知或缺点。

【问题讨论】:

  • 这实际上是一个绝妙的想法:将表视为域。但它有一个限制:您是否希望有一个带有名字的表,并让 fact 表 引用它?还是出生日期?
  • 由于您目前正在学习数据库设计,因此我将这个链接分享给您:slideshare.net/billkarwin/models-for-hierarchical-data 当您需要存储某种分层数据时,它会派上用场。

标签: sql database-design


【解决方案1】:

你也许可以有这样的东西。我没有测试代码,所以请原谅任何错别字。代码是 MS-SQL

CREATE TABLE tblUserDefinedEntity
(
    UserDefinedEntityID INT NOT NULL PRIMARY KEY,
    Name VARCHAR(255)
)

INSERT INTO tblUserDefinedEntity
VALUES
(1,'Person'),
(2,'Business')

-- properties each entity can have.
CREATE TABLE tblUserDefinedEntityProperty
(
    UserDefinedEntityPropertyID INT NOT NULL PRIMARY KEY,
    Name VARCHAR(255)
)

INSERT INTO tblUserDefinedEntityProperty
VALUES
(1,'FirstName'),
(2,'Surname'),
(3,'Address')

 --maps properties to entities EG a person has a firstname
CREATE TABLE tblUserDefinedEntityPropertyMapping
(
    ID INT NOT NULL PRIMARY KEY,
    UserDefinedEntityID INT FOREIGN KEY REFERENCES tblUserDefinedEntityID(UserDefinedEntityID),
    UserDefinedEntityPropertyID INT FOREIGN KEY REFERENCES tblUserDefinedEntityPropertyID(UserDefinedEntityPropertyID ),
)

-- a person has a firstname, surname and address, a business has a firstname and address
INSERT INTO tblUserDefinedEntityPropertyMapping
VALUES
(1,1,1),
(2,1,2),
(3,1,3),
(4,2,1),
(5,2,3)

--all the available values for each attribute, eg all the firstnames, surnames and addresses
CREATE TABLE tblValue
(
    ValueID INT NOT NULL PRIMARY KEY,
    Value VARCHAR(255),
    UserDefinedEntityPropertyID INT FOREIGN KEY REFERENCES tblUserDefinedEntityProperty (UserDefinedEntityPropertyID),
)

INSERT INTO tblValue
VALUES
(1,'John',1),
(2,'James,1),
(3,'Jill',1),
(4,'Smith',2),
(5,'Jones',2),
(6,'123 Fake Street',3)
(7,'124 Fake Street',3)

--creating instances of your entities and assigning them values
CREATE TABLE tblDataEnty
(
    DataItemID INT,
    UserDefinedEntityPropertyMappingID INT FOREIGN KEY REFERENCES tblUserDefinedEntityPropertyMapping(UserDefinedEntityPropertyMappingID),
    ValueID INT FOREIGN KEY REFERENCES tblValue(ValueID),
    PRIMARY KEY (DataItemID, UserDefinedEntityPropertyMappingID)
)
-- we have added
-- john jones (no address)
-- james smith (124 fake street)
INSERT INTO tblDataEnty
VALUES
(1,1,1),
(1,2,5),
(2,1,2),
(2,2,4),
(2,3,7)

【讨论】:

    猜你喜欢
    • 2012-05-22
    • 2010-12-29
    • 1970-01-01
    • 2011-04-21
    • 2011-05-04
    • 1970-01-01
    • 1970-01-01
    • 2019-04-22
    • 1970-01-01
    相关资源
    最近更新 更多