我有一个存储服务注释的表,该表看起来像这样:
<?php
$arrayname=array('iqbal', 'rezza');
$arrayaddress=array('teloyo', 'karang rejo');
for ($x = 0; $x <= 1; $x++)
{
$name=$arrayname[$x];
$address=$arrayaddress[$x]; // indent consistently!!
?>
<script>
function call()
{
var nik = "<?php echo $name ?>"; // semicolons not needed in the embedded PHP code
var addres = "<?php echo $address ?>"; // indent consistently!!
alert(nik+address);
}
</script>
<a href="javascript:call();"><?php echo $name ?></a>
<?php
} ?>
现在,会员系统被添加到系统中,这是一个存储会员信息的表,如下所示:
Comment table
---------------------------
comment_id (auto-increment integer, primary key)
comment (string)
email (string)
成员可以留下多个评论,而一个评论只能由一个成员留下,或者可以由非成员留下(即成员表中不存在电子邮件)。我知道我可以通过打开一个新表(Member table
---------------------
member_id (auto-increment integer, primary key)
.... some other member info .....
email (string, unique)
)来处理它,但我很好奇是否有一种方法可以在注释表的member_comment_pair
上设置外键,这样它就允许{ {1}}可能无法在成员表中找到匹配项?
email
我正在使用MySQL,但如果在MySQL中不可能但在其他类型的数据库系统中允许,我也想知道。
答案 0 :(得分:2)
没有自尊的数据库系统会允许这样的事情,因为它违背了拥有外键的全部目的 你看,外键是确保relational integrity的数据库方式 一个简短的解释是,如果引用列中的数据不存在,则引用列中的数据不会存在。
一旦你允许一个像你所描述的循环洞,你也可以把外键扔出窗外。
我似乎有些奇怪的事情,MySql允许(就像它的行为一样奇怪的组),但如果它允许存在损坏的外键,则不应将其称为关系数据库。
话虽如此,您可以选择至少3种可能的解决方案之一:
在Member
表中创建一个虚拟记录,Comment
表中的“孤儿”记录将链接到该记录。
在Comment
表的email
列中允许空值。
完全删除外键。
我会选择(并且在需要之前完成)第一个解决方案。在Member
表中创建一条记录(将其显示名称设置为“guest”或其他)并将所有孤立注释链接到该表。