2017-09-24 241 views
0

我有一組業務對象,需要存儲特定於對象類型的屬性。我希望這些屬性可以在運行時由用戶定義。我的解決方案是爲每個包含該對象類型的屬性鍵的對象類型設置一個表。設計SQL表格

例如,用戶對象可能具有一組屬性:fname,lname,address,phone,SSN。如果需要,該列表可以建立在應用程序內部,現在包括電子郵件。

然後我有一組表包含給定屬性的所有可能的值。所以我會有一個包含所有地址的表格,一個包含所有電子郵件的表格等。這些表格可能會被不同的對象類型使用,而某些屬性鍵可能有多個值。如果創建了一個新屬性,那麼也會創建一個包含該新值集合的新表。

我遇到的問題是映射出一切,以這種方式我可以識別每個對象的每個實例的每個屬性的值。

任何有關我可能錯過的內容,我應該關注的內容或任何其他解決方案的建議都將不勝感激。

謝謝!

聲明:我是一個相對性新的自學程序員。原諒任何無知或缺點。

+1

這實際上是一個好主意:將表格視爲域。但是它有一個限制:你想要一個帶有名字的表,並讓* fact table引用它?或出生日期? – wildplasser

+0

由於您目前正在學習數據庫設計,請讓我與您分享此鏈接:https://www.slideshare.net/billkarwin/models-for-hierarchical-data 當您需要存儲某種類型的數據時,這將派上用場分層數據。 –

回答

0

你也許可以有這樣的事情。我沒有測試代碼,所以請原諒任何錯誤。代碼是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)