我是数据库和sql的新手。我有一个问题,我有两个表都包含指向另一个主键的外键。我的问题是我有大量的元素,这些元素可以具有不同语言的多个名称,但是必须具有一个主要名称/语言。
alt text http://img688.imageshack.us/img688/1121/11768540.png
首先,我想知道这是否可行,还是我应该已经放弃了?显而易见的解决方案是在ElementName表中有一个额外的布尔字段来表示IsDefaultName
,但它为查询和更新增加了一些额外的复杂性。如果这是最好的解决方案,那么如果设置了IsDefaultName
并且该表已经具有相同的ElementId
和IsDefaultName
设置(或者我需要查询),我如何限制ElementName表不接受任何提交这个手动)?
我试图在这里使用LINQ to SQL。我用来尝试插入新项目的代码使用The INSERT statement conflicted with the FOREIGN KEY constraint "FK_ElementName_Element".
在SubmitChanges上引发了一个异常,我可以理解为什么会这样,但是想知道是否有解决方案/更好的解决方案。
var db = new MyDBDataContext();
var element = new Element();
var elementName = new ElementName() {
ElementName1 = "MyElement",
Language = "English",
};
element.ElementName = elementName;
db.Elements.InsertOnSubmit(element);
db.ElementNames.InsertOnSubmit(elementName);
db.SubmitChanges();
最佳答案
解决方案1
element
------------------
element_id
~....
element_name
------------------
element_name_id
fk_element_id
name
language_id
is_default_name Default ( 0 )
Trigger:
if ( ( select count ( 1 ) from element_name where is_default_name = 1 ) > 1 )
BEGIN
raisError ( 'only 1 element_name may be marked is_default_name = true.', 16, 1 );
END
解决方案2
element
------------------
element_id ( pk )
~....
element_name
------------------
element_name_id ( pk )
fk_element_id
name
language_id
element_name_default
------------------
fk_element_id
fk_element_name_id
( pk - fk_element_id, fk_element_name_id )
解决方案3
element
------------------
element_id
fk_element_name_id_default NULL
~....
element_name
------------------
element_name_id
fk_element_id
name
language_id
order of code:
* Insert to element_name
* update of element
我会坚持你所拥有的,因为那很好,只是:
db.Elements.InsertOnSubmit(element);
db.ElementNames.InsertOnSubmit(elementName);
//I don't know this syntax to say
// set the property of element.fk_element_name_id_default
// to the newly inserted elementName from above
db.Elements.?.?
关于c# - 如何处理相互/递归相关的表?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3122092/