我有一个包含2个表的示例,一个包含订单,另一个包含地址。订单有ID,产品编号和3个不同的地址,一个用于实际交付,一个用于计费,一个用于"谢谢" -letter。
现在我根据orderID获取所有列(所以我以后可以用它在Java中创建一个对象并进一步使用它。)
输出:
orderingsid productnumber CustomerName CustomerStreet CustomerZip CustomerLocation BillingName BillingStreet BillingZip BillingLocation ThankYouName ThankYouStreet ThankYouZip ThankYouLocation
1 70 frank "str a" 17 M frank "str a" 17 M frank "str a" 17 m
2 80 anton "str b" 18 n stefan "str c" 19 o stefan "str c" 19 o
3 90 stefan "str c" 19 o tim "str d" 20 p alice "str e" 21 q
4 100 tim "str d" 20 p frank "str a" 17 M tim "str d" 20 p
5 110 alice "str e" 21 q anton "str b" 18 n anton "str b" 18 n
例如,为了让3名stefan得到了交付,而蒂姆为此付了代价,爱丽丝得到了感谢信,因为她的想法是购买该产品。
我可以用这个MySQL语句创建输出:
select orderings.orderingsid, orderings.productnumber,
delivery.customername as CustomerName,
delivery.street as CustomerStreet,
delivery.zipcode as CustomerZip,
delivery.location as CustomerLocation,
billing.customername as BillingName,
billing.street as BillingStreet,
billing.zipcode as BillingZip,
billing.location as BillingLocation,
thankyou.customername as ThankYouName,
thankyou.street as ThankYouStreet,
thankyou.zipcode as ThankYouZip,
thankyou.location as ThankYouLocation
from orderings
join addresses as delivery on orderings.deliveryaddress = delivery.adressid
join addresses as billing on orderings.billingaddress = billing.adressid
join addresses as thankyou on orderings.thankyouletteradress = thankyou.adressid;
我的问题:
我不确定这是否是最佳方法。这是我为这个SO问题创建的一个例子,我的真实数据库更大,每个表有30-40个属性。这使得select
- 语句非常膨胀,因为我必须手动选择所有列并重命名它们(否则我将有3列名为street
,这在Java中很难处理)。
我已经考虑过规范化数据库并创建3个新表(deliverytable,billingtable,thankyoutable),我将地址分成了几个,但是根据我的方法,我只需要创建1个表。还有3个表,列命名会变得更容易,而连接部分会变得更长,所以我想我不会获得太多(如果我错了,请随时在此纠正我)。
我的方法是否可靠,或者我错过了将来可能会出现可怕错误的事情?
订单表
orderingsid productnumber deliveryaddress billingaddress thankyouletteradress
1 70 1 1 1
2 80 2 3 3
3 90 3 4 5
4 100 4 1 4
5 110 5 2 2
地址表:
adressid customername street zipcode location
1 frank "str a" 17 m
2 anton "str b" 18 n
3 stefan "str c" 19 o
4 tim "str d" 20 p
5 alice "str e" 21 q